6

我想知道以下示例类的属性将以何种顺序序列化:

public class Example implements Serializable {

   private static final long serialVersionUID = 8845294179690379902L;

   public int score;
   public String name;
   public Date eventDate;
}

编辑:

为什么我想知道这个:

我在我的一个类的文件中得到了一个序列化字符串,该类没有 readObject() 或 writeObject() 的实现。现在实现发生了变化(一些属性消失了),我想编写一个处理旧序列化类的 readObject() 方法。

在那里我只会读取此属性,但不会将其保存到创建的对象中。

这基本上仅适用于我现在使用数据库但需要支持旧的序列化文件的遗留问题。

要编写此 readObject(),我需要流中的属性顺序。

4

3 回答 3

12

基于对规范的简要阅读。

  • 字段按字段描述符、类描述符的顺序写入

  • 字段描述符采用“规范顺序”,定义如下:

    “原始类型字段的描述符首先按字段名称排序,然后是对象类型字段的描述符,按字段名称排序。名称使用 String.compareTo 排序。”


(我怀疑关于规范顺序的位应该无关紧要。序列化中字段的实际顺序应该可以从同一序列化中类描述符中字段描述符的实际顺序中恢复。我怀疑原因是规范的指定的顺序是它会影响计算的序列化ID。但我很容易错了:-))


参考:

于 2013-11-13T08:27:39.573 回答
4

关于您的原始问题,一些测试表明,如果您维护了您的 serialVersionUID并且没有删除包含您需要的值的字段,您可能只需反序列化您的旧对象而不会出错。

您不再拥有的任何字段都将被忽略。任何新字段都将被初始化为默认值(例如null,或0等)。

请记住,这种方法可能会违反您对班级施加的限制。例如,null在您的字段中具有值可能(在您看来)是不合法的。

最后警告:这是基于我的一些测试和互联网上的研究。我还没有遇到任何确凿的证据证明这可以保证在所有情况下都有效,也不能保证将来继续有效。小心行事。

于 2013-11-13T09:13:01.743 回答
2

没关系。字段与它们的名称一起被序列化。只要 serialVersionUID 相同,更改顺序不会影响序列化兼容性。还有很多其他的东西也不重要。请参阅对象序列化规范中的版本控制章节。

于 2013-11-13T23:02:34.570 回答