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

时间:2012-12-23 13:49:27

标签: java performance serialization

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

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

5 个答案:

答案 0 :(得分:35)

您可能还想查看FST

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

答案 1 :(得分:31)

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

答案 2 :(得分:7)

尝试Google protobufThrift

答案 3 :(得分:3)

标准序列化添加了许多类型信息,然后在反序列化对象时进行验证。当您知道要反序列化的对象的类型时,通常不需要这样做。

你可以做的是为每个类创建自己的序列化方法,它只是将对象的所有值写入字节缓冲区,以及构造函数(或工厂方法,当你摆动时),这样做字节缓冲区并从中读取所有变量。

但就像AlexR一样,我想知道你是否真的需要它。通常只有在数据离开程序时才需要序列化(比如存储在磁盘上或通过网络发送到另一个程序)。

答案 4 :(得分:1)

众所周知,Java的标准序列化速度很慢,并且在磁盘上使用了大量的字节。进行自定义序列化非常简单 javas std序列化很适合演示项目,但由于上述原因不适合专业项目。进一步的版本控制不在你的掌控之下。

java提供了自定义序列化所需的全部内容,请参阅我的帖子中的演示代码

Java partial (de)serialization of objects

使用这种方法,您甚至可以指定二进制文件格式,这样在C或C#中也可以读入。 另一个优点是自定义setialized对象比主存储器需要更少的空间(布尔需要主memm中的4个字节,但自定义序列化时只需1个字节(作为字节)

如果不同的项目合作伙伴必须阅读您的序列数据,Googles Protobuf是另一种选择。