在我的代码中找不到java.io.OptionalDataException的原因

时间:2012-03-05 14:20:18

标签: java android serialization 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;
    }

我无法弄清楚为什么它有时只会失败。我在其他应用程序中实现了类似的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.err(7588):at   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):at   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)

2 个答案:

答案 0 :(得分:5)

我已经解决了这个问题,我很惭愧地说这是因为我忘了在一个很少使用的类中实现Serializable 。这就是为什么它通常de /序列化好。只有当该类的实例存在时才会出错。

答案 1 :(得分:0)

您是否拥有和集合或集合或类似的数据结构未正确同步,如果您这样做,并且您有其他线程访问它们可能会导致此错误。