BinaryFormatter 字节使用

BinaryFormatter bytes usage

我正在玩 BinaryFormatter 并开始序列化。 用于序列化大型事物,如列表、数组等,并没有考虑使用的字节,因为我知道有一些神奇的字节、类型定义、数据值和其他我无法想象的东西。 F.e:

int[] values = new int[5]{1,2,3,4,5};

结果 48 字节长。 然后发生了一些事情并卡住了我的大脑,我序列化了一个 int 并且它有 58 个字节长。

    MemoryStream stream = new MemoryStream();
    BinaryFormatter formatter = new BinaryFormatter();
    formatter.Serialize(stream, 5);

我错过了什么吗?导致较大的数据(例如 class 的数组)使用较少的内存。 为什么一个基本类型需要所有这些字节? 整个 int(Int32 结构)被序列化?具有 5 个值的 int[] 仍然需要更少的字节。

如果您对数组的 MemoryStream 进行 hexdump,您将获得:

array 
00000 : 00 01 00 00 00 FF FF FF FF 01 00 00 00 00 00 00  .....????.......
00016 : 00 0F 01 00 00 00 05 00 00 00 08 01 00 00 00 02  ................
00032 : 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00 0B  ................

对于您得到的 int 值:

value 
00000 : 00 01 00 00 00 FF FF FF FF 01 00 00 00 00 00 00  .....????.......
00016 : 00 04 01 00 00 00 0C 53 79 73 74 65 6D 2E 49 6E  .......System.In
00032 : 74 33 32 01 00 00 00 07 6D 5F 76 61 6C 75 65 00  t32.....m_value.
00048 : 08 05 00 00 00 0B                                ......

位置 0x17 处的字节很可能是“接下来会发生什么”指示符,因为该字节很长一段时间都保持为 04。

我不需要解释有什么区别。对于数组,有针对已知类型的优化序列化方案。对于其他任何内容,序列化程序都包含类型名称和内部实现细节(m_value 在这种情况下),这可能是该类型的实际值支持字段。

正如 JonasH 在 and similar to an answer I wrote earlier 中指出的那样,不要对 BinaryFormatter 的作用感到好奇,最重要的是不要依赖它的行为在框架版本甚至程序集版本之间保持稳定(如果你以这种格式序列化你自己的类型)并且稳定我的意思是:能够稍后反序列化你今天序列化的内容。