1 java serialization android deserialization
我正在尝试序列化一个对象并将其存储在SD卡上.基本上我正在保存游戏状态.所以我只序列化一个名为GameState的对象,它本身包含各种其他对象和基元,这些对象都是可序列化的.
现在序列化和保存文件工作正常.logcat中没有错误或异常.但是,大约百分之五十的时候,尝试反序列化GameState时,我得到一个异常java.io.OptionalDataException.
我的反序列化方法如下所示:
...
try {
File sdCard = Environment.getExternalStorageDirectory();
instream = new FileInputStream(sdCard.getAbsolutePath()+"/my_app/saved_game");
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
}
try {
ObjectInputStream ois = new ObjectInputStream(instream);
try {
g= (GameState) ois.readObject();
try {
instream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return g;
} catch (ClassNotFoundException ex) {
return null;
}
} catch (StreamCorruptedException ex) {
return null;
} catch (IOException ex) {
return null;
}
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚的是为什么它有时只会失败.我在其他应用程序中实现了类似的de/serialization方法,没有任何问题,所以我感到困惑.GameState不包含静态或瞬态字段.
这是logcat
03-05 23:18:35.458:WARN/System.err(7588):java.io.OptionalDataException 03-05 23:18:35.458:WARN/System.err(7588):at java.io.ObjectInputStream.readNonPrimitiveContent( ObjectInputStream.java:966)03-05 23:18:35.458:WARN/System.err(7588):at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2299)03-05 23:18:35.458:WARN/System.err(7588):at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2254)03-05 23:18:35.468:WARN/System.err(7588):at java.util.ArrayList.readObject(ArrayList .java:674)03-05 23:18:35.468:WARN/System.err(7588):at java.lang.reflect.Method.invokeNative(Native Method)03-05 23:18:35.468:WARN/System.错误(7588):在java.lang.reflect.Method.invoke(Method.java:521)03-05 23:18:35.468:WARN/System.err(7588):at java.io.ObjectInputStream.readObjectForClass(ObjectInputStream .java:1551)03-05 23:18:35.468:WARN/System.err(7588):at java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1474)03-05 23:18:35.468:WARN/System .err(7588):在java.io .ObjectInputStream.readNewObject(ObjectInputStream.java:2153)03-05 23:18:35.468:WARN/System.err(7588):at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:943)03-05 23:18 :35.468:WARN/System.err(7588):at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2299)03-05 23:18:35.468:WARN/System.err(7588):at java.io. ObjectInputStream.readObject(ObjectInputStream.java:2254)03-05 23:18:35.468:WARN/System.err(7588):at java.io.ObjectInputStream.readFieldValues(ObjectInputStream.java:1319)03-05 23:18: 35.468:WARN/System.err(7588):at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:540)03-05 23:18:35.468:WARN/System.err(7588):at java.io.ObjectInputStream .readObjectForClass(ObjectInputStream.java:1566)03-05 23:18:35.468:WARN/System.err(7588):at java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1474)03-05 23:18:35.468 :WARN/System.err(7588):at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:2153)