这是我第一次尝试在任何平台上序列化/反序列化对象,说得客气一点,我很困惑。
将Serializable实现到我的游戏对象后,我将其输出到文件中:
public void saveGameState(){
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
ObjectOutput out = new ObjectOutputStream(bos);
out.writeObject(theGame);//theGame is an instance of the custom class
//TGame which stores game info.
byte[] buf = bos.toByteArray();
FileOutputStream fos = this.openFileOutput(filename,
Context.MODE_PRIVATE);
fos.write(buf);
fos.close();
} catch(IOException ioe) {
Log.e("serializeObject", "error", ioe);
}
File f =this.getDir(filename, 0);
Log.v("FILE",f.getName());
}
这似乎有效,因为我没有提出异常。我只能确定何时将其反序列化。这就是梨形的地方。
public God loadSavedGame(){
TGame g=null;
InputStream instream = null;
try {
instream = openFileInput(filename);
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
}
try {
ObjectInputStream ois = new ObjectInputStream(instream);
try {
g= (TGame) ois.readObject();
return g;
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
} catch (StreamCorruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
我从这里Android Java -- Deserializing a file on the Android platform获得了此代码的基础,并尝试为我的应用修改它。跑步时我得到了
05-31 23:30:45.493: ERROR/copybit(1279): copyBits failed (Invalid argument)
应该加载输出并保存游戏从保存时开始。 任何帮助将不胜感激。
答案 0 :(得分:0)
要序列化或反序列化任何内容,您可以使用SIMPLE api。这是非常容易使用。下载文件并在程序中使用
看看这里
http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php#deserialize
谢谢Deepak
答案 1 :(得分:0)
您显示的错误与序列化完全无关:它实际上是视频显示错误。我建议在序列化之前查看对象以确保它不为空,我还建议序列化到SD卡上的文件以确保实际上有数据输出(因此使用new FileOutputStream("/mnt/sdcard/serializationtest")
作为在调试时,输出流和new FileInputStream("/mnt/sdcard/serializationtest")
作为输入流);您可以在工作后切换回上下文方法,但确保在执行此操作时插入了SD卡。
最后,修改您的日志记录,如下所示:
try {
ObjectInputStream ois = new ObjectInputStream(instream);
try {
g= (TGame) ois.readObject();
return g;
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
android.util.Log.e("DESERIALIZATION FAILED (CLASS NOT FOUND):"+e.getMessage(), e);
e.printStackTrace();
return null;
}
} catch (StreamCorruptedException e) {
android.util.Log.e("DESERIALIZATION FAILED (CORRUPT):"+e.getMessage(), e);
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} catch (IOException e) {
android.util.Log.e("DESERIALIZATION FAILED (IO EXCEPTION):"+e.getMessage(), e);
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
并查看返回的错误。我希望序列化以某种方式失败。
答案 2 :(得分:0)
我创建了下面的类来执行保存和检索对象。
公共类SerializeUtil {
public static <T extends Serializable> void saveObjectToFile(Context context, T object, String fileName){
try {
FileOutputStream fos = context.openFileOutput(fileName, Context.MODE_PRIVATE);
ObjectOutputStream os = new ObjectOutputStream(fos);
os.writeObject(object);
os.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static<T extends Serializable> T getObjectFromFile(Context context, String fileName){
T object = null;
try {
FileInputStream fis = context.openFileInput(fileName);
ObjectInputStream is = new ObjectInputStream(fis);
object = (T) is.readObject();
is.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return object;
}
public static void removeSerializable(Context context, String filename) {
context.deleteFile(filename);
}
}
的