即使在简单的POJO java类中实现java.io.Serializable也是最佳实践吗?

即使在简单的POJO java类中实现java.io.Serializable也是最佳实践吗?,java,serialization,Java,Serialization,一般来说,让简单的POJO Java类实现Java.io.Serializable是一种最佳实践吗?仅当您需要能够序列化它们时。事实并非如此。通常情况下并非如此。约书亚·布洛赫对我说。他描述的缺点总结: 降低了以后更改类实现的灵活性-序列化表单是类API的一部分 使一些bug和安全漏洞更容易出现-攻击者可以访问序列化字节流中的类内部 增加测试负担-现在您必须测试序列化 子类的作者-他们也必须使子类可序列化 当然,有时您需要一个POJO来实现可序列化,比如RMI,但是如果不需要,没有它,您的代

一般来说,让简单的POJO Java类实现Java.io.Serializable是一种最佳实践吗?

仅当您需要能够序列化它们时。事实并非如此。

通常情况下并非如此。约书亚·布洛赫对我说。他描述的缺点总结:

  • 降低了以后更改类实现的灵活性-序列化表单是类API的一部分
  • 使一些bug和安全漏洞更容易出现-攻击者可以访问序列化字节流中的类内部
  • 增加测试负担-现在您必须测试序列化
  • 子类的作者-他们也必须使子类可序列化

当然,有时您需要一个POJO来实现可序列化,比如RMI,但是如果不需要,没有它,您的代码将更简单、更安全。

这更多地取决于需要。在web应用程序的上下文中,一些web服务器(例如Tomcat 6)甚至强制要求序列化在会话中存储其对象的类

为了解决序列化表单不向后兼容的问题,我做了一件事(比如在运行的系统上动态重新加载类时),就是将要保存的字段加载到hashmap中,然后序列化它。这样,即使缺少字段,我也可以在数据中进行反序列化。您可能必须为缺少的键提供默认值,但这总比搞乱字段顺序要好