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

在我的代码中找不到java.io.OptionalDataException的原因,java,android,serialization,deserialization,Java,Android,Serialization,Deserialization,我正在尝试序列化一个对象并将其存储在SD卡上。本质上,我是在拯救游戏状态。所以我只是序列化一个叫做GameState的对象,它本身包含各种其他对象和原语,这些对象都是可序列化的 现在,序列化和保存文件工作正常。logcat中没有错误或异常。然而,在尝试反序列化游戏状态时,大约有50%的时间我会遇到一个异常,java.io.OptionalDataException 我的反序列化方法如下所示: ... try { File sdCard = Environment.getEx

我正在尝试序列化一个对象并将其存储在SD卡上。本质上,我是在拯救游戏状态。所以我只是序列化一个叫做GameState的对象,它本身包含各种其他对象和原语,这些对象都是可序列化的

现在,序列化和保存文件工作正常。logcat中没有错误或异常。然而,在尝试反序列化游戏状态时,大约有50%的时间我会遇到一个异常,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;
    }
我不明白的是为什么它只是偶尔失败。我在其他应用程序中实现了类似的反序列化方法,没有任何问题,所以我感到困惑。游戏状态不包含静态或瞬态字段

这是logcat

03-05 23:18:35.458:警告/系统错误(7588): java.io.OptionalDataException 03-05 23:18:35.458: 警告/系统错误(7588):在 readNonPrimitiveContent(ObjectInputStream.java:966) 03-05 23:18:35.458:警告/系统错误(7588):在 java.io.ObjectInputStream.readObject(ObjectInputStream.java:2299) 03-05 23:18:35.458:警告/系统错误(7588):在 java.io.ObjectInputStream.readObject(ObjectInputStream.java:2254) 03-05 23:18:35.468:警告/系统错误(7588):在 java.util.ArrayList.readObject(ArrayList.java:674)03-05 23:18:35.468: 警告/系统错误(7588):在 java.lang.reflect.Method.Invokenactive(本机方法)03-05 23:18:35.468:警告/系统错误(7588):在 java.lang.reflect.Method.invoke(Method.java:521)03-05 23:18:35.468: 警告/系统错误(7588):在 java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1551) 03-05 23:18:35.468:警告/系统错误(7588):在 java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1474) 03-05 23:18:35.468:警告/系统错误(7588):在 java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:2153) 03-05 23:18:35.468:警告/系统错误(7588):在 readNonPrimitiveContent(ObjectInputStream.java:943) 03-05 23:18:35.468:警告/系统错误(7588):在 java.io.ObjectInputStream.readObject(ObjectInputStream.java:2299) 03-05 23:18:35.468:警告/系统错误(7588):在 java.io.ObjectInputStream.readObject(ObjectInputStream.java:2254) 03-05 23:18:35.468:警告/系统错误(7588):在 java.io.ObjectInputStream.ReadFieldValue(ObjectInputStream.java:1319) 03-05 23:18:35.468:警告/系统错误(7588):在 ObjectInputStream.defaultReadObject(ObjectInputStream.java:540) 03-05 23:18:35.468:警告/系统错误(7588):在 java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1566) 03-05 23:18:35.468:警告/系统错误(7588):在 java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1474) 03-05 23:18:35.468:警告/系统错误(7588):在 java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:2153)


是否有和集合或集合或类似的数据结构未正确同步,如果有,以及是否有其他线程访问这些数据结构可能导致此错误。

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

我已经解决了这个问题,我很惭愧地说,这是因为我忘记在一个很少使用的类中实现Serializable。这就是它通常被反序列化的原因。只有当那个类的一个实例出现时,事情才会出错

我已经解决了这个问题,我不好意思说这是因为我忘了在一个很少使用的类中实现Serializable。这就是它通常被反序列化的原因。只有当那个类的一个实例出现时,事情才会出错

我要做的是开始对字段进行注释,以隔离哪个字段导致问题。我要做的是开始对字段进行注释,以隔离哪个字段导致问题。我有一些ArrayList,但我认为这不是同步问题,因为serialize方法没有任何类型的异常或问题,反序列化方法在游戏运行之前(即SurfaceView更新线程之前)被调用。另外,这两种方法都在AsyncTasks内部调用。看看这个线程,这可能是其他线程遇到的真正问题(缺少同步)[link]!我有一些ArrayList,但我不认为这是一个同步问题,因为serialize方法没有任何异常或问题,反序列化方法在游戏运行之前被调用(即在SurfaceView更新线程之前)。另外,这两种方法都在AsyncTasks内部调用。看看这个线程,这可能是其他线程遇到的真正问题(缺少同步)[link]!