具有自定义表单的序列化代理?

莎拉·萨博(Sarah Szabo)

如果我使用序列化代理模式,是否应该writeObject为包含的类或仅为代理提供自定义方法?我应该为代理使用自定义表格吗?我已经阅读了《有效Java》中有关序列化的章节,但是关于自定义表单和代理模式尚不清楚。

斯图尔特·马克斯

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

尽管您不需要writeObject方法,但是您可能应该readObject在原始类中编写一个方法。如果类的较早序列化实例是在引入代理之前进行序列化的,则它们可能在那里。或者,有人可能伪造了看起来像原始类的常规序列化形式的字节流反序列化将绕过代理,并可能创建原始类的格式错误的实例。为避免这种情况,请无条件地从readObject原始类方法中引发异常,以防止任何反序列化绕过代理。(这在《有效的Java》中有所提及,但重要的是,我觉得我应该在这里重复一遍。)

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

java.timeJDK中的序列化通过一个用于多个数据类的单个串行代理来实现。请参阅Ser.java文件,以了解如何完成此操作。但是,这有点复杂,因为它使用Externalizable接口而不是特殊的序列化方法,并且将其委派回数据类以进行读取和写入。但是您可以看到这些原理在起作用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用JaxRS自定义JSON序列化

自定义枚举也是可序列化的吗?

Java自定义序列化

具有自定义条件的杰克逊多态反序列化

如何在Jackson JSON(反序列化)中自定义序列化或转换具有自定义键类型的Map属性?

带有数据注释的枚举类型的Json.NET自定义序列化

GSON自定义序列化程序,用于带有“收集”字段的对象

使用具有IDictionary <Mycustomclass,List <string >>的自定义解析器进行反序列化问题

具有自定义多对多映射的Django序列化模型

自定义反序列化

EF Core中具有自动序列化/反序列化功能的自定义类型

当xml有缩进/换行符时,字典的自定义序列化失败

杰克逊自定义序列化对象

在带有导轨5的包含文件中设置自定义序列化程序

自定义序列化

具有私有列表的自定义集合中的序列化问题

使用Json.NET为具有多个值类型的字段自定义反序列化器

设计器序列化自定义结构

使用Jackson序列化自定义地图

在动态中自定义json序列化

带有注释的类的Jackson自定义序列化程序

带有NHibernate响应的Web API自定义序列化

默认序列化和自定义序列化有什么区别?

带有位大小定义的 Java 自定义序列化和反序列化

Java自定义序列化抛出EOFException

带有自定义属性的 Ruby 类实例的 XML 序列化

序列化自定义配置

使用 @JsonUnwrapped 并拥有自定义序列化程序 (StdSerializer<T>)

反序列化有序的自定义集合