5

クライアントによって逆シリアル化されるいくつかの大きなオブジェクト(〜115Mb)をクライアントに送信する.NET4WCFサービスがあります。オブジェクトが最初に入ると、正常に逆シリアル化されます。ただし、後続のすべての呼び出しは。をスローしOutOfMemoryExceptionます。すべてがブロックIDisposablesに包まれていることを確認しました。BinaryFormatterのメモリ不足例外の逆シリアル 化やMemoryStreamからの逆シリアル化がC#でOutOfMemory例外をスロー usingするなど、これに類似した他の質問を見てきました。SimonHewittのOptimizedSerializerの使用など、人々が推奨するソリューションのいくつかを試しました。ただし、最終的には、オブジェクトの逆シリアル化に依然依存しています。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

4

1 に答える 1

1

そのサイズの場合はBinaryFormatterを使用することはお勧めしません(実際、binaryformatterを使用していない場合は、おそらくはるかに小さくなります)。表形式のデータなどのかなり単純なデータである場合、または循環参照がないなどの制約がある場合は、単純なバイナリライターを使用して独自のバイナリシリアル化をロールするか、protobuf-netjson.netなどの既製のシリアライザーを使用する必要があります。よりコンパクトになり、大幅に高速化されます。

于 2012-06-01T14:30:13.607 に答える