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

标签 java file serialization file-io

如果我使用序列化代理模式,我应该为包含的类提供自定义的 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/

相关文章:

java - 创建 FIle Java 时转义正斜杠

java - 将对象转换为 HTTP 请求参数(键/值对)

java - 我的 pom.xml 包含此 maven-formatter-plugin,但未构建。我需要定义格式目标吗?

java - 在两个不同的 JAVA 包下使用相同的对象?

c++ - 在 C++ 中打开一个文件,相对的还是绝对的?

ios - 应用程序更新后来自 bundle 的声音仍然存在

java - 如何序列化包含java中对象的对象?

django - 如何使用模型字段过滤 serializers.SlugRelatedField 查询集

java - 将图像与实体一起保存在数据库中

java - 是 Spring Data Mongodb,我如何在不通过 ID 的情况下从另一个文档引用一个文档