我们的代码中有一个实现Serializable的
java类.它已经在类中定义了serialVersionUUId.除此之外,我们还有另一个
static final String sVersion是一个整数.该类实现了readObject和writeObject api.在readObject API中,它使用InputStream填充所有成员变量,在writeObject API中,它获取OutputStream并调用writeObject方法.
现在我需要添加一个布尔数组作为此类的属性.我应该更改serialVersionUUID吗?如果我更改/不更改版本ID会产生什么影响?
什么是最佳实践?我试图通过joshua bloch进入有效的java,但需要一个快速易于消化的答案.
谢谢
最佳答案
This class implements the readObject and writeObject api. In the readObject API it populates all the member variables using the InputStream and in the writeObject API , it gets an OutputStream and calls the writeObject method.
为什么?如果您根本不提供这些方法,则这是默认操作. [虽然我不知道’获取一个OutputStream`究竟是什么意思,除非你是指作为参数提供的那个.]
但是现在你在这里,你在readObject()中所要做的就是尝试读取新字段并捕获抛出的异常(如果它们不存在(OptionalDataException?)),并在writeObject()中写出额外的领域.
不要更改serialVersionUID.您应该探索序列化的广泛对象版本控制支持,(a)确保该类实际上现在是序列化不兼容的,根据规范很难实现; (b)尝试一个方案,如自定义read / writeObject()方法,readResolve / writeReplace()方法,serializableFields声明等,以确保流保持兼容.更改实际的serialVersionUID是最后的手段,绝望的忠告.
在继续进行之前,你需要对Object Versioning section of the Object Serialization Specification有一个很好的了解.序列化对类的进化有很多支持,比大多数人似乎都知道,包括这个问题的其他受访者和他们所关联的问题.