我有两个类,一个在服务器上,另一个在客户端应用程序上,它们具有相同的字段和构造函数,但方法不同。 (特别是服务器类有setter而客户端没有)
我已经读过Oracle文档,Serializable
接口允许我保留对象的状态,据我所知,它在序列化期间打包字段并在反序列化时重建对象。
我不清楚的是,我是否需要拥有该类的精确副本,或者这些方法对于序列化是不重要的,我可以使用2个具有相同字段和构造函数的不同类。
答案 0 :(得分: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
提供的容忍和弹性。但是,我观察到添加/删除方法没有效果,并且通常非常容忍地处理添加/删除字段。我能够造成的唯一不兼容性是通过更改类版本之间字段的类型。
答案 1 :(得分:-1)
通常,您使用序列化来编写和读取具有相同类的数据。如果您的字段相同(名称,类型,顺序),则它可能适用于不同的类。好主意!
您可以考虑使用XStreams。该库通过反射进行序列化,并且比正常的序列化限制性更小。