【发布时间】:2015-03-19 21:51:13
【问题描述】:
这个问题是SerializationException when serializing lots of objects in .NET 的后续问题。
情况:我有一个节点网络,这些节点都是相互连接的,每个节点可能有 10-30 个变量和/或引用。该网络大约有 900 万个条目,但我已经裁剪了 11,000 个条目的一部分,并切断了指向网络其余部分的引用。
我正在尝试将这部分网络写入磁盘,但出现以下错误:
System.Runtime.Serialization.SerializationException
"The internal array cannot expand to greater than Int32.MaxValue elements."
注意:正如stuartd 所指出的,可以序列化的项目数量限制为6 million。
最可能的原因是我不知道与其他网络的连接仍然存在,但是我已经非常详细地搜索了代码,试图找到可能存在的连接,但是没有任何运气(我会继续寻找,所以这可能仍然是原因,但我也想探索其他途径)。
问题:我可能会遇到 BinaryFormatter 的哪些陷阱/容易犯的错误?我能做些什么来克服这个大小限制?
编辑:添加序列化代码。 “this”是我的包含 11,000 个节点的网络对象。
Stream testFileStream = File.Create(filename);
BinaryFormatter serilizer = new BinaryFormatter();
serilizer.Serialize(testFileStream, this);
testFileStream.Close();
【问题讨论】:
-
强调“潜力”。
-
根据this article实际限制在6M左右
-
您可能只想自己开始重写和实现序列化。存储在 BinarySerialized 对象中的元数据非常大。私有类小部件 { 私有 int _f = 3;需要 140 个字节来存储...如果我让命名空间更长,更多字节。将 _f 更改为 _field... 4 个字节。即使您重新排序字段并在 DLL 的后一版本中添加一些字段,这也使您能够反序列化,但也许您不需要这些功能并且只想存储具有 4 个字节的小部件的整数值。
-
@user922020 您是否建议覆盖以减少实际存储的数据量或增加可存储的数据量?目前我存储的大部分数据都在
字典和节点列表中,但在不久的将来,该字典将更改为许多明确设置的属性。我不相信在字符串键或属性名称方面真的可以删减任何东西,优先级也应该放在快速反序列化上。 -
减少。但这真的取决于系统认为什么是“元素”。我会尝试回答,但我没有要测试的数据集。
标签: c# .net serialization