Kryo序列化库:是否用于生产?

2022-09-01 04:33:46

Kryo是一个非常新颖有趣的Java序列化库,也是节俭原型基准测试中最快的库之一。如果您已经使用过 Kryo,它是否已经达到足够的成熟度,可以在生产代码中试用它?

更新 (10/27/2010):我们正在使用Kryo,尽管尚未投入生产。有关详细信息,请参阅下面的答案。

更新 (3/9/2011):更新到最新的Jackson和Kryo库表明,Jackson的二进制Smile序列化非常具有竞争力。


答案 1

我会试着回答我自己的问题(Kyro还很新!

我们有一组大约120种不同的Web服务,使用Restlet框架实现。这些由 Web 服务客户端使用,这些客户端通常构建在基于 Restlet 的客户端库之上。在服务器和客户端之间来回发送的表示包括XML(使用XStream序列化库),JSON(使用Jackson),XHTML,Java对象序列化,以及截至昨天的Kryo。因此,我们可以进行一些可靠的并排比较。

Kryo 1.0.1似乎相当稳定。一旦我真正阅读了如何使用API,我发现的唯一真正的问题是,默认的java.util.Date序列化程序似乎将日期扭曲了几个月。我只需要提供我自己的覆盖:

kryo.register(Date.class, 
  new SimpleSerializer<Date>() {
   @Override public void write (ByteBuffer b, Date d) { b.putLong(d.getTime()); }
   @Override public Date read (ByteBuffer b) { return new Date(b.getLong()); }
  });

但这是我迄今为止发现的唯一可能的问题。我们有一组 JavaBean,它们具有字符串、浮点数、整数、长整型、日期、布尔值和列表字段。

以下是一些粗略的基准。首先,我对描述一个电视节目的对象层次结构进行了100,000次序列化和反序列化(即,制作了100,000个深度副本)。速度是:

XStream XML:                 360/sec
Java Object Serialization: 1,570/sec
Jackson JSON:              5,000/sec
Kryo:                      8,100/sec

接下来,我还序列化了包含 2,000 个电视节目描述和字节数的目录:

XStream XML:         6,837,851 bytes
Jackson JSON:        3,656,654 bytes
Kryo:                1,124,048 bytes

我还发现注册序列化程序非常重要:

kryo.register(List.class);
kryo.register(ArrayList.class);
// ...
kryo.register(Program.class);
kryo.register(Catalog.class);
// ...

如果我不这样做,序列化几乎是大小的两倍,速度可能慢40%。

我们还使用这四种序列化方法中的每一种对几种Web服务进行了完整的端到端测试,并且它们还表明Kryo的运行速度比其他方法快。

因此,总而言之,Kryo似乎相当强大。我将在我们的代码库中继续支持它,随着我们获得使用它的经验,我希望在更多地方使用它。向Kryo团队致敬!

更新 (3/9/2011):我终于开始@StaxMan的建议,尝试Jackson 1.6的二进制“Smile”序列化程序。使用 Jackson 1.6 和 Kryo 1.04,我对一个有点不同的电视节目对象层次结构进行了 100,000 个深度副本(序列化/反序列化):

XStream XML:     429/sec    5,189 bytes
Jackson JSON:  4,474/sec    2,657 bytes
Kryo:          4,539/sec    1,066 bytes  
Jackson Smile: 5,040/sec    1,689 bytes

此测试没有与宏级测试相吻合,在宏级测试中,我在提供许多此类对象的 REST Web 服务中尝试了不同的序列化程序。在那里,整体系统吞吐量支持@StaxMan对性能的直觉:

Jackson JSON:     92 requests/sec
Jackson Smile     97 requests/sec
Kryo:            108 requests/sec

答案 2

有一个错误报告和一个讨论线程。Kryo 附带的日期序列化程序在大小方面比 SO 上发布的 SimpleSerializer 实现稍微高效一些,因为它使用针对正值优化的 LongSerializer。

编辑:我忘了回答原来的问题。我相信Kryo至少用于少数生产系统。在本文中提到了它,Jive SBS缓存重新设计:第3部分。在“摧毁所有人类”项目中,Kryo被用来与充当机器人大脑的Android手机进行通信(视频在这里)。

不是直接的答案,但您可以浏览Kryo源代码和/或javadocs。查看 Kryo 类上的读取 * 和写入 * 方法,然后查看序列化程序类。这确实是库的核心。