【问题标题】:Generate Java Externalizable readExternal() / writeExternal() blocks automatically自动生成 Java Externalizable readExternal() / writeExternal() 块
【发布时间】:2011-10-28 11:41:15
【问题描述】:

我正在处理一个 Java 的本机序列化速度很慢的项目,因此我们希望转向在类上实现 Externalize 接口以获得卓越的性能。

但是,这些类有很多数据成员,我们已经意识到在编写这两个方法时很容易出错。我们只是在这些函数中读取/写入类的所有成员,没什么特别的。是否有某种方法可以在离线进程或编译时自动生成 readExternal() writeExternal() 块以进行外部化?

我查看了http://projectlombok.org/,类似的东西会很理想。

同样,我们希望保持这些类不可变,但不可变类无法实现可外部化的接口——我们想使用有效 java 中的代理类模式——生成该类也很有用。

【问题讨论】:

    标签: java serialization code-generation lombok


    【解决方案1】:

    我正在做一个 Java 原生序列化速度慢的项目

    有多慢?为什么?从长远来看,通过大量手工编码使其速度更快是最不可能经济可行或可维护的。序列化开销应该真正归结为传输中的时间和空间限制。没有什么特别的原因说明 Java 的默认序列化比您计划的所有手动编码的结果要慢得多。你最好调查原因。例如,您可能会发现放置得当的 BufferedOutputStream 可以解决您的所有问题。

    【讨论】:

    • 它在运行时使用反射进行序列化,这总是会变慢。查看code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking 比较不同的序列化方法。
    • @MrLebowski 我知道它使用反射,但在实践中,它真的支配网络和磁盘带宽吗?他们是否将其包含在测试中?或者只是序列化为 ByteArrayOutputStreams 例如?你可能会发现这一切完全是学术性的。
    • 感谢您指出这一点。在此处查看统计信息:pastebin.com/yi4JhhVb --- 因此,从可外部化到可序列化的总序列化相关时间增加仅为 1 毫秒左右 - 网络时间的增加是不好的。我正在尝试压缩流,看看它是否有帮助。最好还是自动化外部化或更好的自动化序列化。
    • @MrLebowski 这样的差异很可能比测量误差小得多。除非你使用像caliper 这样的东西。
    • @maaartinus,序列化实际上不使用反射,它使用sun.misc.Unsafe,它非常擅长(存储字段偏移量)。但是大多数时候它比手动序列化慢一个数量级,默认序列化必须写字段名,类名,字段类型等。它使用递归来扫描对象图。并发调用也存在一些瓶颈(即多核等)。如果序列化被识别为瓶颈,则应将其替换——底线,虽然方便但不是很快。
    【解决方案2】:

    关于龙目岛项目it's rejected the feature.

    我会考虑利用替代框架:

    • SBE - 用于金融交易;
    • kryo project - 用于 Java 兼容性;
    • FlatBuffers - 用于惰性零复制解析和跳过嵌套结构的能力;
    • Protobuf - 比平面缓冲区更紧凑,但在随机访问区域中缺少解析(可能在平面缓冲区中,例如在内存映射文件上)。

    Java 序列化在吞吐量、大小、可移植性和架构迁移方面都非常低效。

    MapStruct - 如果需要最少的自定义代码(和 IDE 支持),将可变的东西映射到不可变的东西是一个不错的选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-10
      • 1970-01-01
      • 1970-01-01
      • 2018-03-12
      • 2015-10-17
      • 1970-01-01
      相关资源
      最近更新 更多