c# - 来自 BinaryFormatter.Deserialize 的 OutOfMemory 异常来自其内部 StringBuilder 调用

标签 c# deserialization out-of-memory stringbuilder binaryformatter

我有一个 .NET 4 WCF 服务向客户端发送一些被客户端反序列化的大对象 (~115Mb)。对象第一次进入时反序列化很好。但是,所有后续调用都会抛出 OutOfMemoryException。我已经检查以确保我所有的 IDisposables 都包含在 using block 中。我看过与此类似的其他问题,例如 BinaryFormatter outofmemory exception deserialization Deserialize from MemoryStream throws OutOfMemory exception in C# .我尝试了一些人们推荐的解决方案,包括使用 Simon Hewitt's Optimized Serializer .然而,最终他还是依赖于BinaryFormatter来反序列化对象。

我捕获了 OutOfMemoryException 并查看了堆栈跟踪(见下文)。跟踪似乎源自 StringBuilder 类中的内存利用率问题。我读过其他文章,内容是关于 StringBuilder 如何由于在需要更多空间时使用的 (length * 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 替代品来更好地管理内存?

最佳答案

我不建议对任何大小的对象使用 BinaryFormatter(事实上,如果您不使用 binaryformatter,它可能会小很多)。如果它是相当简单的数据,如表格数据或有一些限制,如没有循环引用等,然后使用简单的二进制编写器滚动你自己的二进制序列化,或使用一些现成的序列化程序,如 protobuf-net。或 json.net应该更紧凑,速度更快。

关于c# - 来自 BinaryFormatter.Deserialize 的 OutOfMemory 异常来自其内部 StringBuilder 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10851285/

相关文章:

c# - AxWindowsMediaPlayer 的帧调用

c# - Nest/ElasticSearch按_uid排序

c# - Xml 反序列化 - 将两个元素合并为一个 List<T> 对象

Java SOAP XML 序列化错误

java - "java.lang.OutOfMemoryError : unable to create new native Thread"

java - Android/Java 对象未被垃圾收集

c# - 向 sender 和 e 传递更多参数?

c# - 获取 C# 中链接的外键表的值

java - 反序列化时如何获取多态类的java代码中@JsonTypeInfo中定义的属性?

java - 如何清除permgen内存空间