谨慎的实现Serializable接口

千万不要认为实现Serializable接口会很容易。除非一个类在用了一段时间之后就会被抛弃,否则,实现Serializable接口就是个很严肃的承诺,必须认真对待。如果一个类是为了继承而设计的,则更加需要加倍小心。对于这样的类而言,在“允许子类实现Serializable接口”或“禁止子类实现Serializable接口”两者之间的一个折中设计方案是,提供一个可访问的无参构造器。这种设计方案允许(但不要求)子类实现Serializable接口。

考虑使用自定义的序列化形式

当你决定要将一个类做成可序列化的时候,请仔细考虑应该采用什么样的序列化形式。只有当默认的序列化形式能够合理的描述对象的逻辑状态时,才能使用默认的序列化形式;否则就要设计一个自定义的序列化形式,通过它合理的描述对象的状态。你应该分配足够多的时间来设计类的序列化形式,就好像分配足够多的时间来设计它的导出方法一样。正如你无法再将来的版本中去掉导出方法一样,你也不能去掉序列化形式中的域;他们必须被永久的保留下去,以确保序列化兼容性。选择错误的序列化形式对于一个类的复杂性和性能都会有永久的负面影响。

保护性的编写readObject方法

每当你编写readObject方法的时候,都要这么想:你正在编写一个公有的构造器,无论给它传递什么样的字节流,它都必须产生一个有效的实例。不要假设这个字节流一定代表着一个真正被序列化过的实例。下面以摘要的形式给出一些指导方针,有助于编写出更加健壮的readObject方法:

  • 对于对象引用域必须保持为私有的类,要保护性的拷贝这些域中的每个对象。不可变类的可变组件就属于这一类别。
  • 对于任何约束条件,如果检查失败,则抛出一个InvalidObjectException异常。这些检查动作应该跟在所有的保护性拷贝之后。
  • 如果整个对象图在被反序列化之后必须进行验证,就应该使用ObjectInputValidation接口。
  • 无论是直接方式还是间接方式,都不要调用类中任何可被覆盖的方法。

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

你应该尽可能地使用枚举类型来实施实例控制的约束条件。如果做不到,同步时又需要一个既可序列化又是实例控制的类,就必须提供一个readResolver方法,并确保该类的所有实例域都为基本类型,或者是transient的。

考虑用序列化代理代替序列化实例

每当你发现自己必须在一个不能被客户端扩展的类上编写readObject或者writeObject方法的时候,就应该考虑使用序列化代理模式。要想稳健的将带有重要约束条件的对象序列化时,这种模式可能是最容易的办法。

序列化(serialization)。相关推荐

  1. [.net 面向对象程序设计进阶] (9) 序列化(Serialization) (一) 二进制流序列化

    [.net 面向对象程序设计进阶]  (9)  序列化(Serialization) (一) 二进制流序列化 本节导读: 在.NET编程中,经常面向对象处理完以后要转换成另一种格式传输或存储,这种将对 ...

  2. Boost 序列化 Serialization 底层实现

    0.想写自己的二进制,不知道从何学起 为了写一套自己的二进制IO流,我翻了一遍boost的实现:这里讲输出binary部分 省流助手, 1.如果想实现基础类型的二进制流输出       去找 basi ...

  3. Java序列化(Serialization)的理解

    2019独角兽企业重金招聘Python工程师标准>>> 1.什么是序列化 Java是面向对象的编程语言,有时需要保存对象,并在下次使用时可以顺利还原该对象.由于这种需求很常见,所以J ...

  4. python封装函数、实现将任意的对象序列化到磁盘上_序列化(serialization)

    序列化是指将"结构化数据"转换成"可存储格式"的过程,逆向转换过程被称为逆序列化. 比如在 Python 中,结构化数据对象 dict 并不能直接存储到文件中: ...

  5. Boost - 序列化 (Serialization)

    From: https://blog.csdn.net/zj510/article/details/8105408 程序开发中,序列化是经常需要用到的.像一些相对高级语言,比如JAVA, C#都已经很 ...

  6. boost序列化(Serialization)

    本文章转载自 http://m.blog.csdn.net/zj510/article/details/8105408 程序开发中,序列化是经常需要用到的.像一些相对高级语言,比如JAVA, C#都已 ...

  7. java oracle序列化_Java序列化(Serialization)的理解

    1.什么是序列化 Java是面向对象的编程语言,有时需要保存对象,并在下次使用时可以顺利还原该对象.由于这种需求很常见,所以Java API对此提供了支持,添加相关程序代码到标准类库中,并将保存和还原 ...

  8. JAVA之序列化(Serialization)的理解

    1.什么是序列化 Java是面向对象的编程语言,有时需要保存对象,并在下次使用时可以顺利还原该对象.由于这种需求很常见,所以Java API对此提供了支持,添加相关程序代码到标准类库中,并将保存和还原 ...

  9. java安全编码指南之:序列化Serialization

    文章目录 简介 序列化简介 注意serialVersionUID writeObject和readObject readResolve和writeReplace 不要序列化内部类 如果类中有自定义变量 ...

  10. C++ 序列化 serialization 如何将类持久化?

    C++的类的持久化可以通过下面文章中所使用的方法来实现 其原理是将对象的内容以二进制的形式保存到文件中, 在要读取的时候再使用相反的过程来加载到对象中. 总结起来就是可以为要进行持久化的对象,比如说配 ...

最新文章

  1. 数据预处理--噪声_为什么数据对您的业务很重要-以及如何处理数据
  2. 用数据告诉你王思聪到底有多少钱?
  3. pandas高级处理-分组与聚合
  4. 刚刚,2021泰晤士高等教育亚洲大学排名出炉
  5. 《Shell脚本学习指南》第四章 文本处理工具
  6. 【推导】【NTT】hdu6061 RXD and functions(NTT)
  7. 科普 | 一文完全理解AUC-ROC曲线
  8. ssh项目放到服务器上出现404,项目运行一段时间,后台程序无法启动,404错误
  9. ITK:创建具有相关类ID的样本列表
  10. .NET Core 中如何在运行中加载 Controller ?
  11. 变压器符号_3D动画解析油浸式和干式变压器,看完让你秒懂
  12. jzoj3301-[集训队互测2013]家族【并查集,暴力】
  13. 前端安全配置之Content-Security-Policy(csp)
  14. Eclipse GBK批量转UTF-8插件(转)
  15. 【英语学习】【WOTD】sequester 释义/词源/示例
  16. 用asp.net实现微博系统_微信几亿人在线的点赞、取消点赞系统,用Redis如何实现?...
  17. 5.2.4 std::atomic:指针运算
  18. 时间操作(JavaScript版)—根据不同区时显示相应的时间
  19. HDU 4031 Attack
  20. 如何解决MacBook休眠时耗电过大的问题

热门文章

  1. Photoshop抠图教程(超详细)
  2. 春分时节,迎一场春暖花开
  3. 集合的基本运算及文氏图
  4. 几何画板如何制作文氏图
  5. Python制作微信小助手
  6. Linux学习(2)---绝对路径和相对路径
  7. JavaEE Spring框架学习笔记(AOP Introductions介绍)
  8. [一起来做动图吧]Animate制作简单动图,包教包会,不会举报
  9. 「硬刚Doris系列」Apache Doris的向量化和Roaring BitMap
  10. 鸿蒙开放beta版有什么用,鸿蒙2.0beta活动有什么内容 鸿蒙2.0 Beta手机版什么时候发布...