C# BinaryFormatter中的OutOfMemory异常。来自其内部StringBuilder调用的反序列化

C# BinaryFormatter中的OutOfMemory异常。来自其内部StringBuilder调用的反序列化,c#,deserialization,out-of-memory,stringbuilder,binaryformatter,C#,Deserialization,Out Of Memory,Stringbuilder,Binaryformatter,我有一个.NET 4 WCF服务,它向客户端发送一些大对象(~115Mb),这些对象由客户端反序列化。对象第一次进入时,它将进行反序列化。但是,所有后续调用都会抛出OutOfMemoryException。我已检查以确保所有IDisposables都使用块包装在中。我已经研究了其他类似的问题,比如和。我尝试了一些人们推荐的解决方案,包括使用。然而,最终,他仍然依赖于BinaryFormatter来反序列化对象 我捕获了OutOfMemoryException,并查看了堆栈跟踪(见下文)。跟踪似乎

我有一个.NET 4 WCF服务,它向客户端发送一些大对象(~115Mb),这些对象由客户端反序列化。对象第一次进入时,它将进行反序列化。但是,所有后续调用都会抛出
OutOfMemoryException
。我已检查以确保所有
IDisposables
都使用
块包装在
中。我已经研究了其他类似的问题,比如和。我尝试了一些人们推荐的解决方案,包括使用。然而,最终,他仍然依赖于
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,它可能会小得多)。如果是非常简单的数据,如表格数据或具有一些约束条件,如无循环引用等,则使用简单的二进制编写器滚动您自己的二进制序列化,或使用一些现成的序列化程序,如或,应该更紧凑,且速度明显更快。

即使在第一次调用中,对象的大小是否相同?可以吗你发布了一些代码,以防万一。是的,这两种情况下的响应完全相同。我每次都检查确切的字节大小以确保。我会看看是否可以提取一些代码,但它相当长。