【问题标题】:Java custom serialization best practicesJava 自定义序列化最佳实践
【发布时间】:2012-04-20 16:30:27
【问题描述】:

我正在尝试通过从 Serializable 接口切换到 Externalizable 来提高我们当前的序列化性能,但还没有找到很多关于创建自定义和高性能序列化的最佳实践的文档。我当前的解决方案大约是普通 Java 序列化的两倍,虽然不错,但似乎并没有我期待的巨大改进 (Benchmark of serialization techniques/libraries)

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

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

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

谢谢。

【问题讨论】:

    标签: java performance serialization


    【解决方案1】:

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

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

    【讨论】:

    • 该计划实际上是评估几种可能的方式,并根据性能和可维护性来看看我们最喜欢哪种方式。我们不需要它们中的许多提供的跨语言支持,因此自定义 Java 代码似乎是一种可能性。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-21
      • 2013-07-27
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-23
      • 1970-01-01
      相关资源
      最近更新 更多