具有更好性能的Java序列化替代方案

Mic*_*ael 19 java performance serialization

假设我使用标准Java对象序列化来向/从内存缓冲区写入/读取小(<1K)Java对象.最关键的部分是反序列化,即从内存缓冲区(字节数组)中读取Java对象.

对于这种情况,是否有更快的标准Java序列化替代方案?

R.M*_*ler 36

您可能还想看一下FST.

还提供了远程读/写的工具

  • 哇,对于我的用例,我只是通过使用他们的[Plain ObjectOutputStream Replacement](https:/ /github.com/RuedigerMoeller/fast-serialization/wiki/Serialization#plain-objectoutputstream-replacement).如果您依赖项目中的JDK序列化,那么这个lib绝对是必须尝试的! (4认同)
  • 真的很喜欢FST.谢谢! (3认同)

rad*_*dai 33

看看kryo.它比内置的序列化机制(写出很多字符串并且很大程度上依赖于反射)要快得多,但是使用起来有点困难.
编辑:R.Moeller下面建议FST,我从来没有听说过,但看起来比kryo快,兼容java内置序列化(这应该使它更容易使用),所以我看在那一号

  • java内置的序列化机制在每个序列化实例的开头写下完全限定的类名 - 否则在反序列化时它不会知道它在看什么.kryo可以(可选)注册()已知的类(如果你事先知道你将要读/写的类型)并且可以使用小的int头而不是FQCN - 这么小的尺寸.您还可以为类注册Serializers,避免反射查找(可序列化接口,序列化注释等) - 更快的io.kryo没有处理对象版本(默认情况下,vs serialVersionUID) - 再次更快. (5认同)

Spy*_*Bot 7

试试Google protobufThrift.

  • Protobuf 本身并不是一个序列化器。它是一种用于创建 protobuf 类对象的消息格式。为了创建这些对象,它默认使用其运行语言的 SerDes,例如,如果您使用 C++,则默认情况下它使用 C++ SerDes。如果您使用 java,那么在后端它会使用 Java SerDes 来创建这些消息。另一方面,Kryo 是 SerDes,速度非常快。有时在 Spark 中将其用作 SerDes 来创建 proto/avro 类型的对象是很常见的。 (2认同)