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

Serialization - differences between C++ and Java

本文关键字:区别 之间 c++ 序列化 Java      更新时间:2023-10-16

我最近一直在运行一些基准测试,试图找到c++和Java的"最佳"序列化框架。对我来说,构成"最好"的因素是反/序列化的速度以及序列化对象的最终大小。

如果我看一下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

您是否比较了数据的绝对大小?我会说Java有更多的开销,所以如果您将数据"压缩"到序列化缓冲区中,那么开销会减少得更多。在C/c++中,您几乎拥有物理数据大小所需的最小值,因此没有太多的压缩空间。事实上,您必须添加额外的信息来反序列化它,这甚至可能导致增长。

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

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

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