序列化 - C ++和Java之间的差异

时间:2013-05-24 06:45:30

标签: java c++ serialization

我最近一直在运行一些基准测试,试图找到C ++和Java的“最佳”序列化框架。对我来说构成“最佳”的因素是 de / serializing的速度以及序列化对象的结果大小。

如果我查看Java中各种框架的结果,我会看到结果byte []通常小于内存中的对象大小。内置的Java序列化甚至都是这种情况。如果你再看一些其他产品(protobuf等),尺寸会减小甚至更多。

当我看到C ++大小(boost,protobuf)上的内容时,结果对象通常不比原始对象小(并且在某些情况下更大)时,我感到非常惊讶。

我在这里遗漏了什么吗?为什么我在Java中免费获得大量的“压缩”而不是在C ++中?

n.b用于测量Java中对象的大小,我正在使用Instrumentation http://docs.oracle.com/javase/6/docs/api/java/lang/instrument/Instrumentation.html

2 个答案:

答案 0 :(得分:3)

您是否比较了数据的绝对大小?我会说Java有更多的开销,所以如果你将数据“压缩”到一个序列化的缓冲区,开销量会减少很多。在C / C ++中,您几乎只需要物理数据大小所需的最低限度,因此压缩空间不大。实际上,您必须添加其他信息以对其进行反序列化,这甚至可能导致增长。

答案 1 :(得分:1)

由于数据成员之间的偏移位,可以观察到对象大小大于实际数据大小。

当一个对象被序列化时,这些偏移位被丢弃,因此序列化对象内存更小。

由于java是一个托管环境,它需要更多这样的偏移数据来控制内存和所有权,因此,它们的压缩率更大。