我会试着回答我自己的问题(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
-
Java 套接字:程序在套接字处停止。getInputStream() w/o error? “在输入流之前”是 cmd 行上的最后一个生命体征。没有引发异常。为什么会发生这种情况?我不明白。。。 args[0] 是 5000。编辑:冲洗没有帮助。
-
-
如何找出序列化 Java 对象的 serialVersionUID? 我有几个可序列化的类,它们是在没有指定串行VersionUID的情况下编译的。我现在需要向这些类添加一些数据成员,但希望保留一些已经序列化的对象。 是否无论如何都要找出这些序列化对象的
-
为什么Java的序列化比第三方API慢? 在处理套接字并在它们上序列化对象的过程中,我注意到有一些第三方库可以在Java上更快地进行对象序列化,例如。到目前为止,我期望Java的序列化是优化和最快的。因为,它依赖于语言,并
-
java.io.Serializable 类的意义是什么? 在“外行”术语中,我想知道是否有人可以向我解释导入Serializable类以实现java.io.Serializable接口的重要性和一般重要性。来自 Java 学生的提问