[英]Maintaining a Serializable class in Java/Android
我正在将一个对象序列化为SQLiteOpenHelper中的blob,如下所示:
final ByteArrayOutputStream bos = new ByteArrayOutputStream();
final ObjectOutputStream out = new ObjectOutputStream(bos);
out.writeObject(value);
out.close();
每个类定义自己永远不会改变的serialVersionUID。
序列化/反序列化实际上如何工作? 它是否记住了字段的名称以及与之关联的值? 如果我继续添加/删除字段,是否有可能现有字段的值已修改?
例如,假设我序列化了这个类:
public class Foo implements Serializable {
private static final long serialVersionUID = 4068188167994381987L;
String x;
int y;
}
Where x is "A", and y is 1;
然后我像这样修改类:
public class Foo implements Serializable {
private static final long serialVersionUID = 4068188167994381987L;
float f;
String x;
}
如果我继续添加/删除字段,每次我反序列化Foo
x仍然是“A”?
您无法删除字段。 请参阅Oracle ,以获取对Serializable
类的兼容更改。
在课堂上改变后是Foo
一个年长的反序列化Foo
将设置X到“A”,而是因为你删除一个字段,这并不工作。
我建议保留旧字段y
并将其标记为@deprecated
:
public class Foo implements Serializable {
private static final long serialVersionUID = 4068188167994381987L;
String x;
float f;
@deprecated int y;
}
不,如果更改字段顺序或字段类型,则反序列化将无法正常工作。 它将导致异常或读取不正确的数据。
这就是为什么每次进行更改时都建议更改serialVersionUID,以便更改类的序列化格式。
如果您希望灵活地更改类内部而不破坏序列化,则应使用Externalizable接口。
我将使用“magic”序列化方法writeObject和readObject来定义自定义序列化流。 这样,你的类的新版本可以读取旧格式,并根据一些转换算法填充新字段(这里,读取y int并根据它设置f的值)。
有关序列化“魔术”方法的更多信息,请参见此处: http : //thecodersbreakfast.net/index.php?post/ 2011 / 05/12 / Serialization-and- magic-methods
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.