У меня возникают проблемы с сериализацией множества объектов в .NET. Граф объекта довольно большой, и некоторые из новых наборов данных используются, поэтому я получаю:
System.Runtime.Serialization.SerializationException
"The internal array cannot expand to greater than Int32.MaxValue elements."
Кто-нибудь еще попал в этот предел? Как вы его решили?
Было бы неплохо, если бы я по-прежнему мог использовать встроенный механизм сериализации, но, похоже, нужно просто сворачивать мои собственные (и поддерживать обратную совместимость с существующими файлами данных)
Все объекты POCO и сериализуются с использованием BinaryFormatter
. Каждый сериализуемый объект реализует ISerializable
, чтобы выборочно сериализовать его элементы (некоторые из них пересчитываются во время загрузки).
Похоже, что это открытая проблема для MS (подробности здесь), но она была решена как Wont Fix. Подробности (со ссылкой):
Двоичная сериализация не выполняется для объекта графики с более чем 13,2 миллионами объекты. Попытка сделать это вызывает исключение в ObjectIDGenerator.Rehash с вводящее в заблуждение сообщение об ошибке Int32.MaxValue.
После изучения ObjectIDGenerator.cs в SSCLI Исходный код, кажется, что больше Графы объектов могут обрабатываться добавление дополнительных записей в размер массива. См. Следующие строки:
// 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};
Однако было бы неплохо, если бы сериализация разумный размер графа объекта.