代码之家  ›  专栏  ›  技术社区  ›  gtrak

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

  •  7
  • gtrak  · 技术社区  · 14 年前

    2 回复  |  直到 14 年前
        1
  •  7
  •   dty    14 年前

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

    如果没有,则需要阅读序列化文档,以了解向后兼容功能的工作原理。本质上,我 认为 您可以发送接收方不期望的字段,并且您很好;您可以漏掉字段,它们将在接收端获得默认值。但是 你应该在说明书上查一下!

    如果只是添加方法,那么它们对序列化没有影响,除非它们是 readResolve()

        2
  •  2
  •   David Blevins    14 年前

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

    序列号 readObject writeObject 也。

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

    绝对最坏的情况(尽管在某些情况下非常有用)是 writeReplace readResolve 在另一侧重建或定位复杂对象。当你需要把它拔出来的时候是很少见的,但是当你这么做的时候却非常有趣。