在可能被序列化的类上使用字节码增强技术是安全的吗?为什么?

时间:2010-10-14 21:14:39

标签: java serialization amf bytecode-manipulation jibx

我还没试过,但这似乎有风险。我正在考虑的案例是使用JiBX来处理简单的VO类。这些VO将通过AMF和其他可能的方案进行序列化。任何人都可以确认或否认我的怀疑,即像字节码增强这样的幕后操作可能会弄乱一些东西,并提供一些背景信息,为什么?另外,我对JiBX的具体情况感兴趣。

2 个答案:

答案 0 :(得分:7)

在幕后,序列化使用反射。您的字节码操作可能是添加字段。因此,除非您将这些字段标记为瞬态,否则它们将像普通字段一样被序列化。

所以,如果你在两边都执行了相同的字节码操作,你会没事的。

如果您还没有,则需要阅读序列化文档以了解向后兼容性功能的工作原理。从本质上讲,我认为你可以发送接收者不期望的字段,你很好;你可以错过字段,他们将在接收端获得默认值。但你应该在规范中检查这个!

如果您只是添加方法,那么它们对序列化没有影响,除非它们是序列化机制专门使用的readResolve()等内容。

答案 1 :(得分:2)

向类中添加/更改/删除公共或受保护的字段或方法将影响其反序列化的能力。和添加接口一样。这些用于生成serialVersionUID以及作为序列化过程的一部分写入流的其他内容。如果在反序列化期间类的serialVersionUID与加载的类不匹配,那么它将失败。

如果您在类定义中明确设置serialVersionUID,则可以通过此方式获得。您可能还希望实施readObjectwriteObject

在极端情况下,您可以实现Externalizable并完全控制对象的所有序列化。

绝对最坏的情况(虽然在某些情况下非常有用)是在复杂对象上实现writeReplace以将其与序列化中的一种更简单的值对象交换出来。然后在反序列化中,更简单的值对象可以实现readResolve来重建或定位另一侧的复杂对象。当你需要把它拉出来时很少见,但是当你这么做时非常有趣。