【问题标题】:Cannot find reason for java.io.OptionalDataException in my code在我的代码中找不到 java.io.OptionalDataException 的原因
【发布时间】:2012-03-23 00:21:51
【问题描述】:

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

现在序列化和保存文件工作正常。 logcat 中没有错误或异常。但是,在尝试反序列化 GameState 时,大约 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;
    }

我不明白为什么它有时会失败。我已经在其他应用程序中实现了类似的反序列化方法,没有任何问题,所以我很困惑。 GameState 不包含静态或瞬态字段。

这是日志猫

03-05 23:18:35.458:警告/System.err(7588): java.io.OptionalDataException 03-05 23:18:35.458: 警告/System.err(7588):在 java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:966) 03-05 23:18:35.458:警告/System.err(7588):在 java.io.ObjectInputStream.readObject(ObjectInputStream.java:2299) 03-05 23:18:35.458:警告/System.err(7588):在 java.io.ObjectInputStream.readObject(ObjectInputStream.java:2254) 03-05 23:18:35.468:警告/System.err(7588):在 java.util.ArrayList.readObject(ArrayList.java:674) 03-05 23:18:35.468: 警告/System.err(7588):在 java.lang.reflect.Method.invokeNative(Native Method) 03-05 23:18:35.468:警告/System.err(7588):在 java.lang.reflect.Method.invoke(Method.java:521) 03-05 23:18:35.468: 警告/System.err(7588):在 java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1551) 03-05 23:18:35.468:警告/System.err(7588):在 java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1474) 03-05 23:18:35.468:警告/System.err(7588):在 java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:2153) 03-05 23:18:35.468:警告/System.err(7588):在 java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:943) 03-05 23:18:35.468:警告/System.err(7588):在 java.io.ObjectInputStream.readObject(ObjectInputStream.java:2299) 03-05 23:18:35.468:警告/System.err(7588):在 java.io.ObjectInputStream.readObject(ObjectInputStream.java:2254) 03-05 23:18:35.468:警告/System.err(7588):在 java.io.ObjectInputStream.readFieldValues(ObjectInputStream.java:1319) 03-05 23:18:35.468:警告/System.err(7588):在 java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:540) 03-05 23:18:35.468:警告/System.err(7588):在 java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1566) 03-05 23:18:35.468:警告/System.err(7588):在 java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1474) 03-05 23:18:35.468:警告/System.err(7588):在 java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:2153)

【问题讨论】:

  • 我要做的是开始评论字段以找出导致问题的原因。

标签: java android serialization deserialization


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我有一些 ArrayLists 但我不认为这是一个同步问题,因为序列化方法没有任何异常或问题,并且反序列化方法在游戏之前被调用运行(即在 SurfaceView 更新线程之前)。在 AsyncTasks 中也调用了这两种方法
    • 看看这个线程,接缝是其他人遇到的真正问题(缺乏同步)[链接]forums.terracotta.org/forums/posts/list/3927.page
    猜你喜欢
    • 1970-01-01
    • 2022-11-24
    • 2021-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多