【发布时间】:2010-10-08 19:42:36
【问题描述】:
我在 .NET 中序列化大量对象时遇到问题。对象图非常大,使用了一些新的数据集,所以我得到:
System.Runtime.Serialization.SerializationException
"The internal array cannot expand to greater than Int32.MaxValue elements."
还有其他人达到这个限制吗?你是怎么解决的?
如果可能的话,如果我仍然可以使用内置的序列化机制会很好,但似乎必须自己滚动(并保持与现有数据文件的向后兼容性)
所有对象都是POCO,并且正在使用BinaryFormatter 进行序列化。每个被序列化的对象都实现ISerializable 以选择性地序列化其成员(其中一些在加载期间重新计算)。
这似乎是 MS (details here) 的未解决问题,但它已被解决为无法修复。详细信息(来自链接):
对象的二进制序列化失败 超过~1320万的图表 对象。这样做的尝试导致 一个例外 ObjectIDGenerator.Rehash 与 误导性错误消息引用 Int32.MaxValue.
经审查 SSCLI 中的 ObjectIDGenerator.cs 源代码,看起来更大 对象图可以由 将附加条目添加到 大小数组。请参阅以下几行:
// Table of prime numbers to use as hash table sizes. Each entry is the // smallest prime number larger than twice the previous entry. private static readonly int[] sizes = {5, 11, 29, 47, 97, 197, 397, 797, 1597, 3203, 6421, 12853, 25717, 51437, 102877, 205759, 411527, 823117, 1646237, 3292489, 6584983};但是,如果 序列化适用于任何 对象图的合理大小。
【问题讨论】:
标签: .net serialization