繁体   English   中英

在Java / Android中维护Serializable类

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM