java标准序列化顺序

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

public class Example implements Serializable { private static final long serialVersionUID = 8845294179690379902L; public int score; public String name; public Date eventDate; } 

编辑:

为什么我想知道这个:

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

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

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

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

基于对规范的简要阅读。

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

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

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


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


参考:

  • Java对象序列化规范 – 第4.3节和第6.4.1节(关于“nowrclass”生产的注释)

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

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

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

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

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