Java自定义序列化最佳实践

时间:2012-04-20 16:30:28

标签: java performance serialization

我试图通过从Serializable接口切换到Externalizable来改进我们当前的序列化性能,但是没有找到关于创建自定义和高性能序列化的最佳实践的大量文档。我目前的解决方案大约是Java序列化的两倍,虽然好,但看起来并不像我期望的那样大的改进(Benchmark of serialization techniques/libraries

对于除了原语以外的任何东西,我采用写0或1的方法来显示该字段存在,然后在值为1时读取该字段:

if (in.read() == 1) {
    name = in.readUTF();
}

这听起来是对的吗?是否有更好的编码使用?那么地图,列表和其他复杂的数据结构呢? Enums的默认序列化是否正常?

感谢。

2 个答案:

答案 0 :(得分:2)

任何不使用现有序列化框架的原因 - 但比Java内置的更好?我自己的偏好是Protocol Buffers,但也有其他选择,例如Thrift。我会尽量避免做你自己的低级序列化,除非你真的无法避免它。您链接到的页面显示 lot 替代品。

您应该考虑性能可维护性。虽然Externalizable 可以为您提供出色的表现,但最终取决于您如何实施它 - 而且您可以做得很好,或者做得不好......但它会一切都是手动的。

答案 1 :(得分:0)

从可维护性的角度来看,我尝试使用生成的数据传输对象。这样就可以从单个定义中生成toString,hashCode,equals,readObject,writeObject以及它们的Builder类。

就速度而言,它取决于您的原始数据类型。反序列化/反序列化有三个主要成本

  • 使用反射,这是自定义序列化的主要好处,因为您可以对字段和类型进行硬编码
  • 创建新对象。您可以使用回收的对象,但这可能很棘手。
  • 您读/写的字节数。使用更紧凑的形式可以提供帮助。