gpt4 book ai didi

java - 使用自定义表单的序列化代理?

转载 作者:太空宇宙 更新时间:2023-11-04 06:45:53 25 4
gpt4 key购买 nike

如果我使用序列化代理模式,我应该为包含的类提供自定义的 writeObject 方法,还是仅提供代理?我是否应该为代理使用自定义表单?我读过《Effective Java》中有关序列化的章节,但不清楚自定义表单和代理模式。

最佳答案

当您使用序列化代理模式时,原始类的实例永远不会使用“正常”序列化机制进行序列化。因此,如果原始类有一个 writeObject 实现,它永远不会被调用。

虽然您不需要 writeObject 方法,但您可能应该在原始类中编写一个 readObject 方法。如果您的类的旧序列化实例在您引入代理之前已序列化,则它们可能就在那里。或者,有人可能伪造了一个看起来原始类的常规序列化形式的字节流。反序列化会绕过代理并可能创建原始类的格式错误的实例。为了防止这种情况发生,请从原始类的 readObject 方法中无条件抛出异常,以防止任何绕过代理的反序列化。 (Effective Java 中提到了这一点,但我觉得我应该在这里重复它,这一点很重要。)

至于串行代理的自定义形式,这并不是绝对必要的。 Effective Java 建议串行代理类设计得足够简单明了,以便您可以使用默认的序列化形式。如果这对您有用,那就太好了,您可以使用默认表单。但我开始看到的另一种模式是使用单个序列化代理作为多个不同可序列化类的代理。在这种情况下,代理类不是嵌套类,而只是同一包中的包私有(private)类。代理可能希望有一个自定义序列化形式,以便它可以改变写入的序列化数据,具体取决于它是哪个类的代理。

JDK 中新的 java.time 类的序列化可以实现此目的,并为多个数据类使用单个串行代理。请参阅Ser.java文件以查看这是如何完成的。不过,这有点复杂,因为它使用外部化接口(interface)而不是特殊的序列化方法,并且它委托(delegate)回数据类来进行读取和写入。但您可以看到工作原理。

关于java - 使用自定义表单的序列化代理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24005223/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com