У меня есть служба .NET 4 WCF, которая отправляет клиенту несколько больших объектов (~ 115 МБ), которые десериализуются клиентом. В первый раз, когда объект входит, он отлично десериализуется. Однако все последующие вызовы выдают ошибку OutOfMemoryException
. Я проверил, чтобы убедиться, что все мои IDisposables
заключены в using
блоков. Я просмотрел другие вопросы, подобные этому, такие как десериализация исключений из памяти BinaryFormatter и Десериализация из MemoryStream вызывает исключение OutOfMemory в C#. Я пробовал некоторые решения, которые рекомендовали люди, включая использование Оптимизированный сериализатор Саймона Хьюитта. Однако, в конце концов, он по-прежнему полагается на BinaryFormatter
для десериализации объектов.
Я поймал OutOfMemoryException
и посмотрел на трассировку стека (см. ниже). Трассировка возникает из-за проблемы с использованием памяти в классе StringBuilder
. Я читал другие статьи о том, как StringBuilder
может вызвать проблемы с памятью из-за алгоритма (длина * 2), который они используют, когда требуется больше места.
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)
Есть ли способ заставить BinaryFormatter
работать по-другому и не использовать StringBuilder
, или есть хорошая альтернатива BinaryFormatter
, которая лучше управляет памятью?