Tengo un servicio .NET 4 WCF que envía al cliente algunos objetos grandes (~ 115Mb) que el cliente deserializa. La primera vez que entra el objeto deserializa bien. Sin embargo, todas las llamadas posteriores lanzan un OutOfMemoryException
. Revisé para asegurarme de que todos mis IDisposables
están envueltos en bloques using
. He visto otras preguntas similares a esta, como BinaryFormatter outofmemory exception deserialization y Deserialize from MemoryStream throws OutOfMemory exception in C# . He intentado algunas de las soluciones que las personas recomiendan, incluido el uso de Simon Hewitt's Optimized Serializer. Sin embargo, al final, todavía confía en BinaryFormatter
para deserializar objetos.Excepción de OutOfMemory de BinaryFormatter.Deserialize procedente de su llamada interna StringBuilder
Cogí el OutOfMemoryException
y miré el rastro de la pila (ver a continuación). La traza parece originarse de un problema con la utilización de la memoria en la clase StringBuilder
. He leído otros artículos sobre cómo StringBuilder
puede causar problemas de memoria debido al algoritmo (longitud * 2) que utilizan cuando se necesita más espacio.
at System.Text.StringBuilder.ToString()
at System.IO.BinaryReader.ReadString()
at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.ReadObjectString(BinaryHeaderEnum binaryHeaderEnum)
at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run()
at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream)
¿Hay una manera de conseguir BinaryFormatter
a trabajar de manera diferente y no utilizar StringBuilder
o hay una buena alternativa a BinaryFormatter
que administra la memoria mejor?
¿Era el objeto del mismo tamaño incluso en la primera llamada? ¿Puedes publicar algún código, por si acaso? –
Sí, fue la misma respuesta en ambos casos. Comprobé el tamaño exacto de bytes cada vez para asegurarme. Veré si puedo extraer algún código, pero es bastante largo. – MrWuf