序列化独立于方法吗?

Ice*_*aze 5 java serialization deserialization

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

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

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

And*_*gan 3

是的 - 根据影响序列化的类型更改(Java 8) 列表(其中包含兼容和不兼容更改的列表),唯一对兼容性有影响的方法是:

  • writeObjectreadObject
  • writeReplacereadResolve

因此更改 getter 和 setter 应该没有影响。事实上,只有当你开始改变领域时,你才会遇到问题。

另请参阅:Java 序列化,UID 未更改。我可以向类添加新变量和方法吗?

更新:当然,这确实假设该类的两个实例具有相同的、显式设置的值serialVersionUID,这对于这个问题来说是正确的。上述规则确定一侧对类规范的更改是否与UID 所暗示的合同兼容(或者破坏)。如果两边都没有serialVersionUID设置,并且考虑到UID 生成规则更加全面(即包括方法名称、修饰符、签名,那么几乎对任一类的任何更改都将被视为不兼容。

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