为什么 BinaryFormatter 试图序列化太多数据?

Why is BinaryFormatter trying to serialize too much data?

这个问题是 SerializationException when serializing lots of objects in .NET 的后续问题。

情况:我有一个节点网络,这些节点都是相互连接的,每个节点可能有 10-30 个变量 and/or 引用。该网络大约有 900 万个条目,但我裁剪了 11,000 个条目的一部分,并切断了指向网络其余部分的引用。

我正在尝试将这部分网络写入磁盘,但出现以下错误:

System.Runtime.Serialization.SerializationException
"The internal array cannot expand to greater than Int32.MaxValue elements."

注意:正如 the limit to the number of items that can be serialized is 6 million 所指出的那样。

最可能的原因是仍然存在我不知道的与网络其余部分的连接,但是我已经非常详细地搜索了代码,试图找到可能存在潜在连接的位置, 但没有任何运气(我会继续寻找,所以这可能仍然是原因,但我也想探索其他途径)。

问题:我可能遇到的 BinaryFormatter 有哪些 pitfalls/easy 错误?我该怎么做才能克服这个大小限制?

编辑:添加了序列化代码。 "this" 是我的网络对象,包​​含 11,000 个节点。

    Stream testFileStream = File.Create(filename);
    BinaryFormatter serilizer = new BinaryFormatter();
    serilizer.Serialize(testFileStream, this);
    testFileStream.Close();

人们忽略了你的问题,因为它不够具体,无法回答。
但阐明 BinaryFormatter 可能会有所帮助。

因此,您可能想要做的是完全避免序列化,而只进行自己的读取和写入。喜欢这个问题...

BinaryFormatter alternatives

如果完全避免使用BinarySerializer,就不会有任何元素计数导致异常。但是 BinarySerializer 确实保护自己免受无限循环和其他你必须考虑的事情,如果你正在序列化某种网络节点图。这是很多工作。

在我们进一步了解之前,BinaryFormatter 序列化私有变量以及 public。您是否有可能在私有变量中存储了大量内容,但没有将其计入每个对象 30 字节的一部分?

为什么要避免序列化?深入研究 BinaryFormatter,我们发现它有很多开销,允许它从多个版本的 DLL 流式传输数据,它存储私有变量名称,以防您重新排序 class 中的字段。它有特点。如果您不需要功能并且想要快速的性能,请避免使用它。

示例。

    [Serializable]
    class Widgt2
    {
        private string _fieldWithMuchLongerName = "XXX";
    }

如果您只是将它序列化为内存流,然后查看它的字节,您会得到...

   "[=11=][=11=][=11=][=11=]ÿÿÿÿ[=11=][=11=][=11=][=11=][=11=][=11=][=11=]\f[=11=][=11=][=11=]@SOAnswers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null[=11=][=11=][=11=]SOAnswers.Serialzation1+Widget2[=11=][=11=][=11=]_fieldWithMuchLongerName[=11=][=11=][=11=][=11=][=11=][=11=]XXX\v"

存储字符串 "XXX" 需要大量字节。如果您像 List<> 一样存储重复项,二进制格式化程序会变得更加高效。但它仍然具有意味着开销的功能。