【发布时间】:2021-07-21 10:59:07
【问题描述】:
我在玩 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);
我错过了什么吗?导致较大的数据(例如类数组)使用较少的内存。 为什么基本类型需要所有这些字节? 整个 int ( Int32 结构)被序列化了吗?具有 5 个值的 int[] 仍然需要更少的字节。
【问题讨论】:
-
看起来
BinaryFormatter有一种比原语本身更紧凑的方式来序列化原语数组。比较:dotnetfiddle.net/b1vVUR。看看它需要如何将原语序列化为其完全限定名称及其成员的名称,而数组则获得更紧凑的编码。永远不要期望BinaryFormatter生成您类型的 compat 二进制表示:它不是为此而设计的。事实上,不要使用它,因为它不可能确保安全,并且已被弃用 -
作为关于使用 BinaryFormatter 的一般评论,众所周知,它是脆弱、不安全、缓慢且效率低下的。还有更好的替代品,比如 Protobuf、json、bson 等。
-
c# 有隐藏类型和部分结构。所以你的数组有 5 个整数(30 个字节)加上 28 个字节的开销,其中包括变量类型。
标签: c# serialization