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