5

我有一个 .NET 4 WCF 服务,它正在向客户端发送一些被客户端反序列化的大对象(~115Mb)。对象第一次进入它时反序列化很好。但是,所有后续调用都会抛出OutOfMemoryException. 我已经检查以确保我的所有东西IDisposables都包裹在using块中。我已经查看了与此类似的其他问题,例如BinaryFormatter outofmemory 异常反序列 化和Deserialize from MemoryStream throws OutOfMemory exception in C# 。我尝试了一些人们推荐的解决方案,包括使用Simon Hewitt 的 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更好地管理内存?

4

1 回答 1

1

我不建议将 BinaryFormatter 用于任何大小(实际上,如果您不使用 binaryformatter,它可能会小很多)。如果它是相当简单的数据,例如表格数据或有一些约束,例如没有循环引用等,那么使用简单的二进制编写器滚动您自己的二进制序列化,或者使用一些现成的序列化器,如protobuf-netjson.net应该更紧凑,速度更快。

于 2012-06-01T14:30:13.607 回答