java标准序列化顺序

时间:2013-11-13 08:06:47

标签: java serialization serializable

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

public class Example implements Serializable {

   private static final long serialVersionUID = 8845294179690379902L;

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

编辑:

为什么我想知道这一点:

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

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

这基本上只适用于遗产我现在使用数据库但需要支持旧版本 序列化文件。

写这个readObject()我需要流中的属性顺序。

3 个答案:

答案 0 :(得分:11)

基于对规范的简要阅读。

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

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

      

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


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


参考:

答案 1 :(得分:4)

关于您的原始问题,某些测试会建议,如果您maintained your serialVersionUID并且没有removed fields包含您需要的值,则可以直接反序列化旧对象而不会出错。< / p>

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

请记住,这种方法可能会违反您对课程的限制。例如,在您的字段中显示null值可能不合法(在您看来)。

最终警告:这是基于对我的一些测试和互联网上的研究。我还没有遇到任何确凿的证据证明这种情况在所有情况下均有效,也未保证将来继续有效。小心翼翼。

答案 2 :(得分:2)

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