这个问题是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();
答案 0 :(得分:1)
人们正在贬低你的问题,因为它没有足够的具体回答 但是对BinaryFormatter有所了解可能有所帮助。
所以你可能想要做的就是完全避免序列化,只是自己做读和你自己的写。喜欢这个问题...
如果完全避免使用BinarySerializer,则不会有任何元素计数导致异常。但是,如果您要序列化某种网络节点图,BinarySerializer确实可以保护自己免受无限循环以及您必须考虑的其他因素的影响。这是很多工作。
在我们进一步讨论之前,BinaryFormatter序列化私有变量以及公共变量。您是否有可能在私有变量中存储大量内容并且不将其视为每个对象30个字节的一部分?
为什么要避免序列化?深入了解BinaryFormatter,我们发现它有很多开销,允许它从DLL的多个版本流式传输数据,它存储私有变量名称,以防您重新排序类中的字段。它有功能。如果您不需要功能并且想要快速性能,那么请避免使用它。
实施例
[Serializable]
class Widgt2
{
private string _fieldWithMuchLongerName = "XXX";
}
如果你只是将它序列化为一个内存流,然后查看它的字节,你得到......
"\0\0\0\0ÿÿÿÿ\0\0\0\0\0\0\0\f\0\0\0@SOAnswers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\0\0\0SOAnswers.Serialzation1+Widget2\0\0\0_fieldWithMuchLongerName\0\0\0\0\0\0XXX\v"
这是存储字符串“XXX”的大量字节。如果存储像List<>这样的重复,则二进制格式化程序会更有效。但它仍然具有意味着开销的功能。