当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Kryo序列化库:它是否用于生产?》经验,为你挑选了2个好方法。

Kryo是一个非常新颖有趣的Java序列化库,也是thrift-protobuf基准测试中速度最快的库之一.如果你已经使用过Kryo,它已经达到了足够的成熟度,可以在生产代码中试用吗?

更新(2010年10月27日):我们正在使用Kryo,但尚未投入生产.请参阅下面的答案了解详情.

更新(2011年3月9日):更新到最新的Jackson和Kryo​​库表明Jackson的二元微笑序列化非常具有竞争力.



1> Jim Ferrans..:

我会尝试回答我自己的问题(Kyro还是很新的!).

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

Kryo 1.0.1似乎相当稳定.一旦我真正了解了如何使用API​​,我发现的唯一真正问题是默认的java.util.Date序列化程序似乎在过去几个月就会变形.我只需提供自己的覆盖:

kryo.register(Date.class, 
  new SimpleSerializer() {
   @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);
// ...

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

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

总而言之,Kryo似乎相当强大.我将在我们的代码库中继续支持它,并且随着我们获得它的经验,我希望在更多的地方使用它.感谢Kryo团队!

更新(2011年3月9日):我终于找到了@ 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


好东西,谢谢你分享这个!可能有趣且相对容易测试的一件事是看看"Smile"格式(二进制JSON兼容变体,请参阅http://wiki.fasterxml.com/JacksonBinaryFormat)会如何.应该很容易看到,因为它是(a)与Jackson捆绑在一起,(b)具有与Jackson的JSON处理相同的API.性能和尺寸方面它应该比Jackson/JSON更快,但是它与Kryo的接近程度很难说 - 可能是JSON和Kryo​​之间的中途,可能更接近Kryo.

2> NateS..:

There is a bug report and a discussion thread. The DateSerializer that comes with Kryo is slightly more efficient size-wise than the SimpleSerializer implementation posted on SO because it uses LongSerializer optimized for positive values.

编辑:我忘了回答原来的问题.我相信Kryo至少用于几个生产系统.在本文中提到它,Jive SBS缓存重新设计:第3部分.在Destroy All Humans项目中,Kryo习惯于与作为机器人大脑的Android手机进行通信(此处为视频).

不是直接的答案,但您可以浏览Kryo源和/或javadoc.查看Kryo类上的read*和write*方法,然后查看Serializer类.这真的是图书馆的核心.

推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有