我还没试过,但这似乎有风险。我正在考虑的案例是使用JiBX来处理简单的VO类。这些VO将通过AMF和其他可能的方案进行序列化。任何人都可以确认或否认我的怀疑,即像字节码增强这样的幕后操作可能会弄乱一些东西,并提供一些背景信息,为什么?另外,我对JiBX的具体情况感兴趣。
答案 0 :(得分:7)
在幕后,序列化使用反射。您的字节码操作可能是添加字段。因此,除非您将这些字段标记为瞬态,否则它们将像普通字段一样被序列化。
所以,如果你在两边都执行了相同的字节码操作,你会没事的。
如果您还没有,则需要阅读序列化文档以了解向后兼容性功能的工作原理。从本质上讲,我认为你可以发送接收者不期望的字段,你很好;你可以错过字段,他们将在接收端获得默认值。但你应该在规范中检查这个!
如果您只是添加方法,那么它们对序列化没有影响,除非它们是序列化机制专门使用的readResolve()
等内容。
答案 1 :(得分:2)
向类中添加/更改/删除公共或受保护的字段或方法将影响其反序列化的能力。和添加接口一样。这些用于生成serialVersionUID以及作为序列化过程的一部分写入流的其他内容。如果在反序列化期间类的serialVersionUID
与加载的类不匹配,那么它将失败。
如果您在类定义中明确设置serialVersionUID
,则可以通过此方式获得。您可能还希望实施readObject
和writeObject
。
在极端情况下,您可以实现Externalizable并完全控制对象的所有序列化。
绝对最坏的情况(虽然在某些情况下非常有用)是在复杂对象上实现writeReplace
以将其与序列化中的一种更简单的值对象交换出来。然后在反序列化中,更简单的值对象可以实现readResolve
来重建或定位另一侧的复杂对象。当你需要把它拉出来时很少见,但是当你这么做时非常有趣。