序列化——C++和Java之间的区别。

5
我最近进行了一些基准测试,试图找到C++和Java的“最佳”序列化框架。 对我来说,“最佳”的因素是反序列化/序列化的速度以及序列化对象的结果大小。
如果我查看Java中各种框架的结果,我会发现生成的byte[]通常比内存中的对象大小要小。即使使用内置的Java序列化也是如此。如果您再看一些其他提供(protobuf等)的东西,大小会进一步减小。
当我在C ++方面看事情时(boost,protobuf),我很惊讶得到的结果对象通常不比原始对象更小(有时甚至更大)。
我错过了什么吗?为什么我在Java中免费获得了相当多的“压缩”,但在C ++中没有呢?
PS:为了测量Java对象的大小,我使用Instrumentationhttp://docs.oracle.com/javase/6/docs/api/java/lang/instrument/Instrumentation.html

long getObjectSize(Object objectToSize) 返回一个特定实现的近似值,表示指定对象所占用的存储空间。结果可能包括部分或全部对象的开销,因此对于在实现内部进行比较非常有用,但不适用于不同实现之间的比较。在JVM的单个调用期间,估计值可能会发生变化。 - user2384396
2个回答

3

你是否比较过数据的绝对大小?我认为Java的开销更大,因此如果将数据“压缩”到序列化缓冲区中,开销的减少会更多。在C / C ++中,物理数据大小几乎达到了最低限度,因此没有太多压缩的空间。事实上,您必须添加附加信息以进行反序列化,这甚至可能导致增长。


我已经更新了帖子,展示了我如何在Java中测量对象大小。你的意思是,Java中的序列化并不比C++更好,而是因为C++中内存中的对象表示更好? - imrichardcole
@imrichardcole,是的,这就是我的意思。您可以将序列化对象转储为字符串,然后比较结果以查看实际发生了什么,因为这只是我的假设。 - Devolus

1

由于数据成员之间的偏移位,对象大小可能会比实际数据大小大。

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

因为Java是一种受管理的环境,它需要更多这样的偏移数据来控制内存和所有权,因此它们的压缩率更高。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接