【问题标题】:Saving my Serialized Class that have not serialized objects like Rect保存没有序列化对象(如 Rect)的序列化类
【发布时间】:2011-12-04 21:54:08
【问题描述】:

我试图在活动调用 onDestroy() 时保存我的序列化对象,但是当我尝试使用 ObjectOutputStream 编写我的对象时,会抛出 java.io.NotSerializableExeption。

你能帮帮我吗?谢谢

【问题讨论】:

    标签: android serialization objectoutputstream objectinputstream object-serialization


    【解决方案1】:

    您需要确保该类实现了java.io.Serializable 接口。还可以考虑改用 Bundles 并将您的数据保存在 onSaveInstanceState 中。有关数据存储的更多信息,请参阅this dev guide topic

    【讨论】:

    • 是的,我在我的 GameField 类上实现 java.io.Serializable,我的 GameField 类包含文件 Rect bouds,当我保存我的 GameField 类时它抛出 java.io.NotSerializableExeption 我认为这是界限.我的问题是如何存储我的界限?谢谢
    • 好吧,在这种情况下,您需要手动序列化对象。您可以覆盖 writeObjectreadObject 方法来执行此操作。
    【解决方案2】:

    我遇到了同样的问题,做了这个类来帮助序列化:

    public class SerializableRect implements Serializable {
    
    private static final long serialVersionUID = 1L;
    
    private Rect mRect;
    
    public SerializableRect(Rect rect) {
        mRect = rect;
    }
    
    public Rect getRect() {
        return mRect;
    }
    
    private void writeObject(java.io.ObjectOutputStream out) throws IOException {
        int left = mRect.left;
        int top = mRect.top;
        int right = mRect.right;
        int bottom = mRect.bottom;
    
        out.writeInt(left);
        out.writeInt(top);
        out.writeInt(right);
        out.writeInt(bottom);
    }
    
    private void readObject(java.io.ObjectInputStream in) throws IOException,
            ClassNotFoundException {
        int left = in.readInt();
        int top = in.readInt();
        int right = in.readInt();
        int bottom = in.readInt();
    
        mRect = new Rect(left, top, right, bottom);
    }
    }
    

    【讨论】:

      【解决方案3】:

      如果你的对象映射包含一个不可序列化的对象,VM 会寻找一个无参数的构造函数,以便使用默认值创建一个对象并继续前进。当它不能时,它会抛出这个异常。最重要的是,对象图中引用的每个对象都必须:

      1. 实现 Serializable,(它的所有成员也都这样做),或者
      2. 从实现 Serializable 的基类继承(并且所有成员都遵循规则),或者
      3. 实现 Serializable 和所有不可序列化的成员都标记为 Volatile,或者
      4. 未如此标记的不可序列化成员具有用于反序列化的无参数默认构造函数。

      你没有提供足够的细节让我更进一步,但我还是不能为你写?通常,您可以从不可序列化的类派生或包装它们并提供必要的功能。只要每个成员都满足我列出的条件,就不应该抛出异常。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-30
        相关资源
        最近更新 更多