Kryo是一个非常新颖和有趣的Java序列化库,也是在thrift-protobuf基准测试中最快的之一。如果您已经使用过Kryo,它是否已经达到足够的成熟度可以在生产代码中尝试?
更新(10/27/2010):我们正在使用Kryo,但尚未在生产环境中使用。有关详情,请参见下面的答案。
更新(3/9/2011):更新到最新的Jackson和Kryo库后,发现Jackson的二进制Smile序列化相当有竞争力。
Kryo是一个非常新颖和有趣的Java序列化库,也是在thrift-protobuf基准测试中最快的之一。如果您已经使用过Kryo,它是否已经达到足够的成熟度可以在生产代码中尝试?
更新(10/27/2010):我们正在使用Kryo,但尚未在生产环境中使用。有关详情,请参见下面的答案。
更新(3/9/2011):更新到最新的Jackson和Kryo库后,发现Jackson的二进制Smile序列化相当有竞争力。
我将尝试回答自己的问题(Kyro还非常新!)。
我们有一组约120个不同的Web服务,使用Restlet框架实现。这些服务通常由基于Restlet的客户端库构建的Web服务客户端所使用。服务器和客户端之间发送和接收的表示包括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()); }
});
但这是我目前发现的唯一可能的问题。我们有一组JavaBeans,其中包含String、Float、Integer、Long、Date、Boolean和List字段。
以下是一些粗略的基准测试结果。首先,我进行了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);
// ...
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
Jackson JSON: 92 requests/sec
Jackson Smile 97 requests/sec
Kryo: 108 requests/sec
这里有一个错误报告和一个讨论主题。Kryo自带的DateSerializer在大小方面比SO发布的SimpleSerializer实现略微更加高效,因为它使用了优化了正值的LongSerializer。
编辑:我忘记回答原始问题了。我相信Kryo至少被用在一些生产系统中。这篇文章中提到了它,Jive SBS缓存重设计:第三部分。在Destroy All Humans项目中,Kryo被用于与作为机器人大脑的Android手机通信(视频在此处)。
虽然不是直接的答案,但您可以浏览Kryo源代码和/或javadocs。查看Kryo类的read*和write*方法,然后查看Serializer类。这实际上是该库的核心。
Kryo是雅虎的S4(简单可扩展流处理系统)项目的一部分。据我所知,S4目前尚未投入生产。
最新版的Kryo在某些极端情况下存在一些竞态条件,从Java运行在ns-3的模拟器接口上。如果我的更改没有问题,可能会要求开发人员将其中一些提交回去。
2017年更新:
Kryo被Flink使用。 因此,几乎所有使用Flink框架的东西都依赖于Kryo。 参考: https://ci.apache.org/projects/flink/flink-docs-release-0.8/programming_guide.html#specifying-keys