5

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?

+0

¿Era el objeto del mismo tamaño incluso en la primera llamada? ¿Puedes publicar algún código, por si acaso? –

+0

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

Respuesta

1

No recomendaría usar BinaryFormatter para nada de ese tamaño (de hecho, sería mucho más pequeño si no estuviera usando binaryformatter). Si se trata de datos bastante simples, como datos tabulares o con algunas restricciones como no referencias circulares, etc., entonces el despliegue de su propia serialización binaria con una simple grabadora binaria o el uso de un serializador estándar como protobuf-net o json.net deberían ser más compactos y significativamente más rápido.

Cuestiones relacionadas