加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

从实现Serializable的旧java类中删除字段

发布时间:2020-12-14 16:23:01 所属栏目:Java 来源:网络整理
导读:假设我有MyClass类的版本,其中我有两个字段int count和String name.我已经将字节流保存到文件中.从类中删除属性名称之后,持久化的字节流也会转换为对象而没有任何问题. 但是根据Serializable文档添加新属性是兼容更改但删除属性是不兼容的更改w.r.t. Serilai
假设我有MyClass类的版本,其中我有两个字段int count和String name.我已经将字节流保存到文件中.从类中删除属性名称之后,持久化的字节流也会转换为对象而没有任何问题.

但是根据Serializable文档添加新属性是兼容更改但删除属性是不兼容的更改w.r.t. Serilaization.我很困惑,有人可以帮我理解这一点.谢谢!!!!

解决方法

几点:

对象反序列化时,字节流中未找到的任何字段将初始化为null.因此,当您添加新字段时,从旧版本字节流反序列化新版本对象时,新字段将初始化为null.如果将null视为无效值,则可以提供readObject方法来处理转换.旧版本仍然可以从新的字节流中反序列化 – 新字段只是被忽略.

如果删除某个字段,则情况相反:旧版本类现在将丢失一个字段.缺少的字段将设置为null.但是,与前一种情况不同,旧版本无法添加readObject方法(如果您可以添加该方法,那么它将成为最新的新版本).因此,删除字段被认为是不兼容的.

总之,在新版本类中创建readObject方法的能力允许它在添加新字段时处理旧版本的字节流.不幸的是,反过来是不可能的.

重要的是要注意,除非特别定义,否则serialVersionUID字段将自动生成,并且很可能随着类的所有显着更改而改变.如果两个类版本具有不同的serialVersionUID,则在尝试对较旧或较新版本的字节流执行序列化/反序列化时将抛出异常.如果您不手动设置serialVersionUID,那么您的类的任何版本都不会兼容序列化.

附:如果null恰好是已删除字段的有效状态(在旧版本中),那么我猜您可以删除字段.然而,这可能是一个边缘情况.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读