26

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

对于这种情况,有没有比标准 Java 序列化更快的替代方法?

4

5 回答 5

43

您可能还想看看FST

还提供堆外读/写工具

于 2012-12-23T15:31:19.687 回答
35

看看kryo。它比内置的序列化机制(写出大量字符串并严重依赖反射)快得多,但使用起来有点困难。
编辑:下面的 R.Moeller 建议FST,直到现在我才听说过,但它看起来比 kryo 更快并且与 java 内置序列化兼容(这应该使它更容易使用),所以我会看在那一天

于 2012-12-23T14:10:15.807 回答
7

试试Google protobufThrift

于 2012-12-23T14:18:01.687 回答
3

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

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

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

于 2012-12-23T13:57:18.073 回答
2

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

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

对象的Java部分(反)序列化

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

如果不同的项目合作伙伴必须读取您的序列化数据,谷歌的 Protobuf 是一个替代方案。

于 2012-12-23T14:10:40.900 回答