Tengo problemas para serializar muchos objetos en .NET. El gráfico de objetos es bastante grande, con algunos de los nuevos conjuntos de datos que se utilizan, por lo que estoy consiguiendo:SerializationException al serializar muchos objetos en .NET
System.Runtime.Serialization.SerializationException
"The internal array cannot expand to greater than Int32.MaxValue elements."
Alguien más ha golpeado este límite? ¿Cómo lo has resuelto?
Sería bueno si todavía puedo utilizar el construido en el mecanismo de serialización si es posible, pero parece que acaba de rodar mi propia (y mantener la compatibilidad con los archivos de datos existentes)
Los objetos son todos POCO y se están serializando usando BinaryFormatter
. Cada objeto que se serializa implementa ISerializable
para serializar selectivamente sus miembros (algunos de ellos se vuelven a calcular durante la carga).
Parece un problema abierto para MS (details here), pero se ha resuelto como Wont Fix. Los detalles son (desde el enlace):
serialización binaria falla por objeto gráficos con más de 13,2 millones de ~ objetos. El intento de hacerlo provoca una excepción en ObjectIDGenerator.Rehash con un mensaje de error engañoso que hace referencia a Int32.MaxValue.
Tras el examen de ObjectIDGenerator.cs en el código fuente SSCLI , parece que más grandes gráficos de objetos podían ser manejados por la adición de entradas adicionales en la matriz tamaños. Ver las siguientes líneas:
// 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};
Sin embargo, sería bueno si serialización trabajó para cualquier tamaño razonable del gráfico de objetos.
Embalar los datos parece una muy buena idea. Incluso puedo usar un MemoryStream para hacer el embalaje, por lo que no es necesario cambiar gran parte del código (puede seguir guardando el modo actual). Y tal vez solo para que las clases "populares" obtengan la cantidad de objetos guardados en un número razonable. – Wilka