仅当您被迫与遗留代码实现互操作性时,此问题的答案才可能令人惊讶,甚至 永远不会或更现实。这是Joshua Bloch 在有效Java,第三版中的建议:
没有理由在您编写的任何新系统中使用Java序列化
甲骨文首席架构师马克·莱因霍尔德(Mark Reinhold)表示,取消当前的Java序列化机制是一项长期目标。
为什么Java序列化存在缺陷
Java作为该语言的一部分,提供了可以使用该Serializable
接口选择的序列化方案。但是,该方案有几个棘手的缺陷,应被Java语言设计者视为失败的实验。
- 它从根本上假装可以谈论对象的序列化形式。但是有无数种序列化方案,导致无数种序列化形式。通过实施一个方案,而无需任何更改方案的方法,应用程序将无法使用最适合他们的方案。
- 它是作为构造对象的一种附加方法而实现的,它绕过了构造函数或工厂方法执行的任何前提条件检查。除非编写棘手,容易出错且难以测试额外的反序列化代码,否则您的代码可能存在巨大的安全漏洞。
- 测试不同版本的序列化表格的互操作性非常困难。
- 处理不可变的对象很麻烦。
该怎么做
而是使用可以显式控制的序列化方案。例如协议缓冲区,JSON,XML或您自己的自定义方案。