我有保存我的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 ... 如果有人有我的建议,我会很高兴。
答案 0 :(得分:3)
如果Paint
和Path
是您可控制的类,那么也可以将它们序列化。如果它们不完全相关或您可以在读取对象时从外部确定它们,则可以创建字段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 mPaint
和Path mPath
字段的数据,您仍希望在序列化中存储并在反序列化过程中检索,为此您必须实现writeObject
和readObject
方法:
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。