java – 序列化是否独立于方法?

我有两个类,一个在服务器上,另一个在客户端应用程序上,它们具有相同的字段和构造函数,但方法不同. (特别是服务器类有setter而客户端没有)

我已经读过Oracle文档,Serializable接口允许我保留对象的状态,据我所知它在序列化期间打包字段并在反序列化时重建对象.

我不清楚的是,我是否需要具有该类的精确副本,或者这些方法对于序列化是不重要的,我可以使用具有相同字段和构造函数的2个不同类.

最佳答案 是 – 根据
Type Changes Affecting Serialization(Java 8)列表,其中包含兼容和不兼容更改的列表,唯一与兼容性有关的方法是:

> writeObject和readObject
> writeReplace和readResolve

因此,改变getter和setter应该没有任何影响.这只是一旦你开始改变你遇到问题的领域.

另见:Java serialization, UID not changed. Can I add new variables and method to the class?

更新:当然,这确实假设类的两个实例都具有相同的,明确设置的serialVersionUID值,这对于这个问题是正确的.上述规则确定一方对类规范的更改是否与UID所暗示的合同兼容 – 或者是中断.如果没有在任何一方设置serialVersionUID,并且假设UID-generation rules更全面(即包括方法名称,修饰符,签名),那么几乎任何一个类的任何更改都将被视为不兼容.

更新2:我需要一个Java类重写器来生成一个完全独立的测试用例,以确认我引用的Java 8文档是正确的,并且如果serialVersionUID被正确使用,那序列化是非常宽容和弹性的.但是,我观察到添加/删除方法没有效果,并且通常非常容忍地处理添加/删除字段.我能够引起的唯一不兼容性是通过更改类版本之间的字段类型.

点赞