几点:
反序列化对象时,字节流中未找到的任何字段都将初始化为null
. 因此,当您添加新字段时,当从旧版本字节流反序列化新版本对象时,新字段将被初始化为null
. 如果null
被认为是无效值,您可以提供一种readObject
方法来处理转换。旧版本仍然可以从新的字节流中反序列化——新字段被忽略。
如果一个字段被删除,情况正好相反:旧版本的类现在将缺少一个字段。缺少的字段将设置为null
。但是,与前一种情况不同的是,旧版本不能添加readObject
方法(如果您可以添加该方法,那么它将成为最新的新版本)。因此,删除一个字段被认为是不兼容的。
总之,readObject
在新版本类中创建方法的能力允许它在添加新字段时处理旧版本字节流。不幸的是,反过来是不可能的。
重要的是要注意,除非特别定义,否则该serialVersionUID
字段将自动生成,并且很可能会随着类的几乎所有显着更改而更改。如果两个类版本不同serialVersionUID
,则在尝试对旧版本或新版本字节流执行序列化/反序列化时将引发异常。如果您不手动设置serialVersionUID
,那么您的类的任何版本都不会在序列化方面兼容。
PS如果null
恰好是已删除字段的有效状态(在旧版本中),那么我想您可以删除字段。但是,这可能是一个极端情况。