【Android】なぜかシリアライズできない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

【Android】なぜかシリアライズできない

#1

投稿記事 by みけCAT » 13年前

Eclipse Version:3.7.2
Android: docomo SC-03D ( Galaxy SII LTE) 2.3.6

Tree PuzzleのAndroid移植をしています。
ランキングの読み書きを作ろうとしたのですが、なぜかオブジェクトを書き込むところで例外が発生します。

コード:

package mike.cat.treepuzzle;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

import android.content.Context;
import android.os.Handler;
import android.widget.Toast;

public class RankingIO {
	public static final int RANKING_MAX = 10;

	public class RankingEntry implements Serializable {
		private static final long serialVersionUID = -3454807355767952024L;
		int score;
		int year;
		int month,date,hour,minute,second;
		int[] name=new int[15];
	}

	public class RankingData implements Serializable {
		private static final long serialVersionUID = 8764901814810170848L;
		RankingEntry[] rank=new RankingEntry[RANKING_MAX];
	}
	
	RankingData ranking;
	private Context con;
	private Handler handler;
	
	public RankingIO(TreePuzzleMainView mv) {
		this.con=mv.theContext;
		this.handler=mv.theHandler;
		this.ranking=new RankingData();
		for(int i=0;i<RANKING_MAX;i++)ranking.rank[i]=new RankingEntry();
	}

	void rankDataInit() {
		for(int i=0;i<RANKING_MAX;i++) {
			ranking.rank[i].score=1000-i*100;
			for(int j=0;j<15;j++) {
				ranking.rank[i].name[j]=(j<4?62+i:255);
			}
			ranking.rank[i].year=ranking.rank[i].month=ranking.rank[i].date=0;
			ranking.rank[i].hour=ranking.rank[i].minute=ranking.rank[i].second=0;
		}
		rankDataSave();
	}

	void rankDataLoad() {
		int error=0;//1:IOエラー 2:破損 3:初期状態
		try {
			FileInputStream fis = con.openFileInput("ranking.dat");
			ObjectInputStream ois = new ObjectInputStream(fis);
			ranking=(RankingData) ois.readObject();
			ois.close();
		} catch(IOException e) {
			error=1;
		} catch (ClassNotFoundException e) {
			error=1;
		}
		if(error==0) {
			for(int i=1;i<RANKING_MAX;i++) {
				if(ranking.rank[i].score>ranking.rank[i-1].score) {
					error=2;
					break;
				}
			}
		}
		if(error!=0) {
			rankDataInit();
			if(error==1) {
			    handler.post(new Runnable() {
			        public void run() {
			        	Toast.makeText(con,"ランキングデータの読み込みエラーです。",Toast.LENGTH_SHORT).show();
			        }
			    });
			} else if(error==2) {
			    handler.post(new Runnable() {
			        public void run() {
			        	Toast.makeText(con,"ランキングデータが壊れています。",Toast.LENGTH_SHORT).show();
			        }
			    });
			}
		}
	}

	void rankDataSave() {
		boolean error=false;
		try {
			FileOutputStream fos = con.openFileOutput("ranking.dat", Context.MODE_PRIVATE);
		    ObjectOutputStream oos = new ObjectOutputStream(fos);
		    oos.writeObject(ranking);
		    oos.close();
		} catch(IOException e) {
			e.printStackTrace();
			error=true;
		}
		if(error) {
		    handler.post(new Runnable() {
		        public void run() {
		        	Toast.makeText(con,"ランキングデータの書き込みに失敗しました。",Toast.LENGTH_SHORT).show();
		        }
		    });
		}
	}
}
rankDataSave()関数内の、

コード:

oos.writeObject(ranking);
の部分でjava.io.NotSerializableExceptionが発生します。
どうしてシリアライズできないのでしょうか?
よろしくお願いします。
オフトピック
前のトピックを解決しないままつぎの質問をすることはルール違反ですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

かずま

Re: 【Android】なぜかシリアライズできない

#2

投稿記事 by かずま » 13年前

みけCAT さんが書きました:どうしてシリアライズできないのでしょうか?
RankingEntry と RankingData が RankingIO の内部クラスだからでしょう。
public class RankingIO implements Serializable { とするか、あるいは、
RankingEntry と RankingData を RankingIO の外に出せばよいのでは?

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: 【Android】なぜかシリアライズできない

#3

投稿記事 by みけCAT » 13年前

できました!ありがとうございます!

RankingIO.java

コード:

package mike.cat.treepuzzle;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import android.content.Context;
import android.os.Handler;
import android.widget.Toast;

public class RankingIO {
	public static final int RANKING_MAX = 10;

	RankingData ranking;
	private Context con;
	private Handler handler;
	
	public RankingIO(TreePuzzleMainView mv) {
		this.con=mv.theContext;
		this.handler=mv.theHandler;
		this.ranking=new RankingData();
		for(int i=0;i<RANKING_MAX;i++)ranking.rank[i]=ranking.new RankingEntry();
	}

	public void rankDataInit() {
		for(int i=0;i<RANKING_MAX;i++) {
			ranking.rank[i].score=1000-i*100;
			for(int j=0;j<15;j++) {
				ranking.rank[i].name[j]=(j<4?62+i:255);
			}
			ranking.rank[i].year=ranking.rank[i].month=ranking.rank[i].date=0;
			ranking.rank[i].hour=ranking.rank[i].minute=ranking.rank[i].second=0;
		}
		rankDataSave();
	}

	public void rankDataLoad() {
		int error=0;//1:IOエラー 2:破損 3:初期状態
		try {
			FileInputStream fis = con.openFileInput("ranking.dat");
			ObjectInputStream ois = new ObjectInputStream(fis);
			ranking=(RankingData) ois.readObject();
			ois.close();
		} catch(IOException e) {
			error=1;
		} catch (ClassNotFoundException e) {
			error=1;
		}
		if(error==0) {
			for(int i=1;i<RANKING_MAX;i++) {
				if(ranking.rank[i].score>ranking.rank[i-1].score) {
					error=2;
					break;
				}
			}
		}
		if(error!=0) {
			rankDataInit();
			if(error==1) {
			    handler.post(new Runnable() {
			        public void run() {
			        	Toast.makeText(con,"ランキングデータの読み込みエラーです。",Toast.LENGTH_SHORT).show();
			        }
			    });
			} else if(error==2) {
			    handler.post(new Runnable() {
			        public void run() {
			        	Toast.makeText(con,"ランキングデータが壊れています。",Toast.LENGTH_SHORT).show();
			        }
			    });
			}
		}
	}

	public void rankDataSave() {
		boolean error=false;
		try {
			FileOutputStream fos = con.openFileOutput("ranking.dat", Context.MODE_PRIVATE);
		    ObjectOutputStream oos = new ObjectOutputStream(fos);
		    oos.writeObject(ranking);
		    oos.close();
		} catch(IOException e) {
			e.printStackTrace();
			error=true;
		}
		if(error) {
		    handler.post(new Runnable() {
		        public void run() {
		        	Toast.makeText(con,"ランキングデータの書き込みに失敗しました。",Toast.LENGTH_SHORT).show();
		        }
		    });
		}
	}
}
RankingData.java

コード:

package mike.cat.treepuzzle;

import java.io.Serializable;

public class RankingData implements Serializable {
	private static final long serialVersionUID = 2405646292573613598L;

	public class RankingEntry implements Serializable {
		private static final long serialVersionUID = 802269823074293279L;
		int score;
		int year;
		int month,date,hour,minute,second;
		int[] name=new int[15];
	}

	RankingEntry[] rank=new RankingEntry[RankingIO.RANKING_MAX];
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

“C言語何でも質問掲示板” へ戻る