0

我试图通过从 Serializable 接口切换到 Externalizable 来提高我们当前的序列化性能,但是没有找到很多关于创建自定义和高性能序列化的最佳实践的文档。我目前的解决方案大约是现有 Java 序列化的两倍,虽然不错,但似乎并没有我所期待的巨大改进(序列化技术/库的基准

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

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

那个听起来是对的吗?有更好的编码可以使用吗?地图、列表和其他复杂的数据结构呢?枚举的默认序列化是否正常?

谢谢。

4

2 回答 2

2

有什么理由不使用现有的序列化框架——而是一个比 Java 内置的更好的序列化框架?我自己的偏好是Protocol Buffers,但也有其他选择,例如 Thrift。我会尽量避免进行自己的低级序列化,除非你真的无法避免。您链接到的页面显示了许多替代方案。

您应该同时考虑性能可维护性。虽然Externalizable 可以为您提供出色的性能,但最终取决于您如何实现它-您可以做得好,也可以做得不好……但这一切都是手动的。

于 2012-04-20T16:35:05.537 回答
0

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

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

  • 使用反射,这是自定义序列化的主要好处,因为您可以对字段和类型进行硬编码
  • 创建新对象。您可以使用回收的对象,但这可能很棘手。
  • 您读/写的字节数。使用更紧凑的表格会有所帮助。
于 2012-04-20T17:53:05.420 回答