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

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

更新(10/27/2010):我们正在使用Kryo,虽然尚未投入生产。 详情请参阅下面的答案。

更新(3/9/2011):更新到最新的jackson和Kryo​​图书馆显示,jackson的二元微笑系列化是相当有竞争力的。

有一个错误报告和一个讨论线程 。 Kryo附带的DateSerializer比SO上的SimpleSerializer实现在尺寸方面稍微有效一些,因为它使用LongSerializer为正值进行了优化。

编辑:我忘了回答原来的问题。 我相信至less在less数生产系统中使用Kryo。 本文中提到了它, Jive SBScaching重新devise:第3部分 。 在“ 消灭所有人类”项目中,Kryo被用来与作为机器人大脑的Android手机进行交stream( video在这里 )。

不是一个直接的答案,但你可以浏览Kryo源和/或javadocs 。 查看Kryo类的读取*和写入*方法,然后查看Serializer类。 这真是图书馆的核心。

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

我们有一套使用Restlet框架实现的约120种不同的Web服务。 这些消费者通常build立在基于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()); } }); 

但那是迄今为止我发现的唯一可能的问题。 我们有一组具有String,Float,Integer,Long,Date,Boolean和List字段的JavaBean。

这里是一些粗略的基准。 首先,我做了10万个序列化和反序列化的对象层次结构,描述一个电视节目(即,制作了10万个深度的拷贝)。 速度是:

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

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

 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服务的完整端到端testing,并且还显示出Kryo的运行速度比其他的要快。

所以总的来说,Kryo似乎相当健壮。 我将继续在我们的代码库中支持它,并且随着我们获得它的经验,我希望在更多的地方使用它。 荣誉Kryo团队!

更新(3/9/2011):我终于到了@StaxMan的build议尝试jackson1.6的二进制“微笑”序列化。 使用Jackson 1.6和Kryo​​ 1.04,我完成了一个有点不同的电视节目对象层次结构的深度拷贝(序列化/反序列化)

 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 

这个testing没有和macros观层面的testing相结合,在这个testing中,我在一个REST web服务中尝试了不同的序列化器,这个服务提供了许多这些对象。 整个系统吞吐量支持@ StaxMan关于性能的直觉:

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

Kryo是雅虎S4(简单可扩展stream媒体系统)项目的一部分。 S4据我所知还没有生产。

Jim Ferrans的回复和上面的评论的帮助下,我在这个页面上find了关于Kryodate序列化问题的更详细的解释: http : //groups.google.com/group/kryo-users/browse_thread/thread/91969c6f48a45bdf/还有一个如何使用Kryo的DateSerializer():

kryo.register(Date.class,new DateSerializer());

我希望这可以帮助别人。

Kryo网站有使用Kryo生产项目的部分

Apache Storm在将消息从一个任务传递到另一个任务之前将其用于序列化 。

所以是的,它必须是相当稳定的,因为风暴是由几个大公司 ,即Twitter和Spotify使用。

最新版本的Kryo在极端情况下有一些竞争条件,在Java的ns-3模拟器接口上运行。 如果问题没有问题,可以要求开发者提交一些修改。

Kryo 2.x也被Mule ESB使用,在生产中被广泛使用。

2017更新:

Klink使用Flink。 所以几乎所有使用Flink框架的东西都依赖于Kryo。 参考: https : //ci.apache.org/projects/flink/flink-docs-release-0.8/programming_guide.html#specifying-keys