Effective Java - 保护性地编写readObject方法

        1、readObject方法实际上相当于另一个公有的构造器,如同其他的构造器一样,它也要满足所有注意事项。构造器必须检查其参数的有效性,并且在必要的时候对参数进行保护性拷贝。

        2、当一个对象被反序列化的时候,对于客户端不应该拥有的对象引用,如果哪个域包含了这样的对象引用,就必须要做保护性拷贝。

        3、和构造器一样,readObject方法不可以调用可被覆盖的方法,否则会导致程序失败。

第89条 对于实例控制,枚举类型优先于readResolve

        1、如果依赖readResolve进行实例控制,带有对象引用类型的所有实例域则都必须声明为transient。

        2、readResolve的可访问性很重要。

第90条 考虑用序列化代理代替序列化实例

        1、为可序列化的类设计一个私有的静态嵌套类,精确地表示外围类的实例的逻辑状态。这个嵌套类被称作序列化代理。它应该有一个单独的构造器,其参数类型就是外围类。这个构造器只从它的参数中复制数据:它不需要进行任何一致性检查或者保护性拷贝。

        2、它极大地消除了序列化机制中语言本身之外的特征。

        3、序列化代理有两个局限性,一是不能与被客户端扩展的类兼容,也不能和对象图中包含循环的类兼容。

        4、序列化模式的功能性和安全性开销比较高。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容