如果我使用序列化代理模式,是否应该writeObject
为包含的类或仅为代理提供自定义方法?我应该为代理使用自定义表格吗?我已经阅读了《有效Java》中有关序列化的章节,但是关于自定义表单和代理模式尚不清楚。
当您使用序列化代理模式时,绝不会使用“常规”序列化机制来序列化原始类的实例。因此,如果原始类要有一个writeObject
实现,它将永远不会被调用。
尽管您不需要writeObject
方法,但是您可能应该readObject
在原始类中编写一个方法。如果类的较早序列化实例是在引入代理之前进行序列化的,则它们可能在那里。或者,有人可能伪造了看起来像原始类的常规序列化形式的字节流。反序列化将绕过代理,并可能创建原始类的格式错误的实例。为避免这种情况,请无条件地从readObject
原始类的方法中引发异常,以防止任何反序列化绕过代理。(这在《有效的Java》中有所提及,但重要的是,我觉得我应该在这里重复一遍。)
至于串行代理的自定义形式,这不是绝对必要的。有效的Java建议对串行代理类进行简单而明确的设计,以使您可以使用默认的序列化形式。如果这对您有用,那就太好了,您可以使用默认表单。但是我开始看到的另一种模式是将单个序列化代理用作几个不同的可序列化类的代理。在这种情况下,代理类不是嵌套类,而只是同一包中的包私有类。代理可能希望具有自定义的序列化形式,以便它可以更改所写的序列化数据,具体取决于它是哪个类的代理。
java.time
JDK中新类的序列化通过一个用于多个数据类的单个串行代理来实现。请参阅Ser.java文件,以了解如何完成此操作。但是,这有点复杂,因为它使用Externalizable
接口而不是特殊的序列化方法,并且将其委派回数据类以进行读取和写入。但是您可以看到这些原理在起作用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句