Kryo是一个非常新颖有趣的Java序列化库,也是thrift-protobuf基准测试中速度最快的库之一.如果你已经使用过Kryo,它已经达到了足够的成熟度,可以在生产代码中试用吗?
更新(2010年10月27日):我们正在使用Kryo,但尚未投入生产.请参阅下面的答案了解详情.
更新(2011年3月9日):更新到最新的Jackson和Kryo库表明Jackson的二元微笑序列化非常具有竞争力.
我会尝试回答我自己的问题(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
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类.这真的是图书馆的核心.