我们正在为GAE上的Java对象寻找高性能的紧凑型序列化解决方案。
本机Java序列化不能很好地执行,并且在兼容性方面很糟糕,即如果将字段添加到类中或将其删除,则无法对旧对象进行反序列化。
我们尝试了Kryo,它在其他环境中表现良好,并且在添加字段时支持后兼容性,但不幸的是GAE SecurityManager通过在递归中为每个方法调用添加一个检查来减慢它的速度。我担心这可能是所有序列化库的问题。
有什么想法吗?谢谢!
答案 0 :(得分:2)
要注意,过早的优化是万恶之源。
您应首先尝试其中一种标准解决方案,然后确定它是否符合您的性能要求。我在GAE(java序列化,JSON,JSON + ZIP)上测试了几个序列化解决方案,它们比数据存储访问快了一个数量级。
因此,如果序列化数据需要10毫秒并将其写入数据存储区需要100毫秒,那么在尝试优化10毫秒时几乎没有额外的好处。
是的,你试过杰克逊吗?此外,GAE上的所有API调用都实现为对其他服务器的RPC调用,其中有效负载被序列化为protobuf。
答案 1 :(得分:1)
你需要跨语言能力吗?并重新。高性能是指仅限速度,还是包括针对较少GC的优化内存管理,或包括序列化对象大小?
如果您需要跨语言,我认为Google的protobuf是一个解决方案。但是,它很难被称为“高性能”,因为在Java端创建的UTF-8字符串会导致常量GC。
如果您支持的数据大多是简单的对象,而您不需要合成,我建议您编写自己的序列化层(而不是开玩笑)。
这就是我们为“高性能”java序列化层所做的。基本上,我们可以在合理的时机上实现几乎无对象的序列化/反序列化。