保存数组数据

时间:2013-09-02 06:47:34

标签: java android

我有保存我的arraylist的问题。我想在应用程序销毁或更改意图或更改方向时保存我的arraylist:

public class AuditContainer implements Serializable {
    private Paint mPaint;
    private Path mPath;
    private int x,y;
    private String text;
    boolean is_text;

首先我尝试保存文件,但Paint类不是Serializable类。 其次我尝试使用onSaveInstanceState(Bundle outState)/ onRestoreInstanceState(Bundle savedInstanceState),但我无法保存Arraylist 第三次我尝试使用数据库,但没有任何类型的Paint,Path ... 如果有人有我的建议,我会很高兴。

4 个答案:

答案 0 :(得分:3)

如果PaintPath是您可控制的类,那么也可以将它们序列化。如果它们不完全相关或您可以在读取对象时从外部确定它们,则可以创建字段transient

答案 1 :(得分:3)

您有三种选择:

一个。修改Paint以实施Serializable B.使用transient关键字将字段标记为不是序列化:

private transient Paint mPaint;

℃。为Paint创建自己的Serializable包装器,将关键字段的Serializable副本和delegates功能保存到私有瞬态Paint,并在反序列化后重新初始化Paint实例。

答案 2 :(得分:1)

要省略不可序列化字段的序列化,请将它们标记为transient

public class AuditContainer implements Serializable {
    private transient Paint mPaint;
    private transient Path mPath;
    private int x,y;
    private String text;
    boolean is_text;
}

可能有Paint mPaintPath mPath字段的数据,您仍希望在序列化中存储并在反序列化过程中检索,为此您必须实现writeObjectreadObject方法:

private void writeObject(ObjectOutputStream out)
    throws IOException {
    //default serialization of the object
    out.defaultWriteObject();
    //start manual serialization
    out.writeInt(mPaint.getX());
    out.writeInt(mPaint.getY());
    out.writeObject(mPath.getPath());
}

private void readObject(ObjectInputStream in)
    throws IOException {
    //default serialization of the object
    in.defaultReadObject();
    //start manual deserialization
    int x = in.readInt();
    int y = in.readInt();
    String path = (String)in.readObject();
    //initialize your fields...
    //note: this code maybe won't work, you should adapt it to your needs
    mPaint = new Paint(x, y);
    mPath = new Path(path);
}

答案 3 :(得分:1)

您可以使用XStream之类的第三方。它允许使用将对象保存到xml,并且不需要该对象必须是Serializable。我们公司有类似问题(无法修改且必须保存的类),XStream帮助了我们。 有关简单教程,请查看:http://x-stream.github.io/tutorial.html