繁体   English   中英

用Java序列化

[英]Serializing in java

我们的代码中有一个Java类实现了Serializable,它已经在该类中定义了serialVersionUUId。 除此之外,我们还有另一个

静态最终String sVersion,它是一个整数。此类实现readObject和writeObject api。 在readObject API中,它使用InputStream填充所有成员变量;在writeObject API中,它获取OutputStream并调用writeObject方法。

现在,我需要添加一个布尔数组作为该类的属性。 我应该更改serialVersionUUID吗? 如果我更改/不更改版本ID,将会发生什么影响? 最佳实践是什么?我正在尝试通过joshua bloch进入Effective Java,但需要对此有一个快速易懂的答案。

谢谢

此类实现readObject和writeObject api。 在readObject API中,它使用InputStream填充所有成员变量;在writeObject API中,它获取OutputStream并调用writeObject方法。

为什么? 如果您根本不提供这些方法,则这是默认操作。 [尽管我不知道“获取OutputStream”到底是什么意思,除非您是指作为参数提供的那个。]

但是,现在您在这里,在readObject()要做的就是尝试读取新字段并捕获不存在的异常( OptionalDataException ?),并在writeObject()写出多余的领域。

不要更改serialVersionUID 相反,您应该探索对序列化的广泛对象版本控制支持,(a)确保该类现在确实是序列化不兼容的,按照规范,这很难实现; (b)尝试使用诸如自定义read / writeObject()方法,readResolve / writeReplace()方法,serializableFields声明之类的方案,以确保流保持兼容。 更改实际的serialVersionUID是万不得已,绝望的忠告。

在继续进行任何操作之前,您需要真正了解一下Object Serialization SpecificationObject Versioning部分 序列化对类演化的支持比大多数人似乎更了解,包括对此问题的其他答复者以及他们所链接的问题。

如果有可能最终尝试反序列化该类的不兼容实例,那么可以,您绝对应该更新serialVersionUID。 另一方面,如果您的程序始终对数据进行序列化和反序列化而不将其保存到持久性存储中,或者仍然可以保证您的类与其调用者之间的协定,那么您就无需更改serialVersionUID。

有关更多信息,请参见https://stackoverflow.com/a/286254/44737https://stackoverflow.com/a/285827/44737

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM