2016-10-16 16 views
0

私は大きなプロジェクトを管理しており、XML形式でオブジェクトをシリアル化して送信する必要があります。オブジェクトは〜130MBです。大規模なオブジェクトのためのC#のシリアル化xmlwriter stringwriterメモリ不足

(注:私はこのプロジェクトを書きませんでしたので、このメソッドの外で編集を行うか、アーキテクチャを大幅に変更することはできません。通常はうまくいきますが、オブジェクトが大きければ、 。例外は、私はそれを大きなオブジェクトを処理するための別の方法を行う必要があります)

現在のコードはこれです:それは右のreturnValue = writer.ToStringでメモリ不足の例外のうちを投げている

public static string Serialize(object obj) 
{ 
    string returnValue = null; 

    if (null != obj) 
    { 
     System.Runtime.Serialization.DataContractSerializer formatter = new System.Runtime.Serialization.DataContractSerializer(obj.GetType()); 

     XDocument document = new XDocument(); 

     System.IO.StringWriter writer = new System.IO.StringWriter(); 
     System.Xml.XmlTextWriter xmlWriter = new XmlTextWriter(writer); 

     formatter.WriteObject(xmlWriter, obj); 
     xmlWriter.Close(); 

     returnValue = writer.ToString(); 
    } 

    return returnValue; 
} 

()。

私はそれが私が好むブロック「を使用して」を使用すること書き直し:

これを研究し
public static string Serialize(object obj) 
    { 
     string returnValue = null; 
     if (null != obj) 
     { 
      System.Runtime.Serialization.DataContractSerializer formatter = new System.Runtime.Serialization.DataContractSerializer(obj.GetType()); 
      using (System.IO.StringWriter writer = new System.IO.StringWriter()) 
      { 
       using (System.Xml.XmlTextWriter xmlWriter = new XmlTextWriter(writer)) 
       { 
        formatter.WriteObject(xmlWriter, obj); 
        returnValue = writer.ToString(); 
       } 
      } 
     } 
     return returnValue; 
    } 

を、にStringWriterのToStringメソッドは、実際に二重のRAMを使用しています表示されます。 (私は実際には4GB以上の空き容量のあるRAMを持っているので、なぜメモリ不足が発生しているのかは分かりません)。今私はこれ私がする別の問題を抱えている、もちろん

public static void Serialize(object obj, FileInfo destination) 
{ 
    if (null != obj) 
    { 
     using (TextWriter writer = new StreamWriter(destination.FullName, false)) 
     { 
      XmlTextWriter xmlWriter = null; 
      try 
      { 
       xmlWriter = new XmlTextWriter(writer); 
       DataContractSerializer formatter = new DataContractSerializer(obj.GetType()); 
       formatter.WriteObject(xmlWriter, obj); 
      } 
      finally 
      { 
       if (xmlWriter != null) 
       { 
        xmlWriter.Flush(); 
        xmlWriter.Close(); 
       } 
      } 
     } 
    } 
} 

+0

アプリケーションは 'x86'、 'x64'または 'Any CPU'用にビルドされていますか?ビルドプラットフォームがx86の場合は、64ビット環境でx64として動作する場合はさらに多くのメモリにアクセスできますが、.netアプリケーションは32ビットプロセスとして実行されています。 –

+0

それはx86だから私はそれを変更することはできません。しかし、それでも130メガのオブジェクトなので、どちらの方法でもx86メモリの上限を超えません。 –

+0

32ビットで割り当てることができる*連続メモリの実際的な限界は2GBの理論上の制限よりもはるかに小さいです。たとえば、http://stackoverflow.com/questions/2415434/the-limitation-on-the-size-of-net-array/2415472#2415472を参照してください。このコードにはどのような変更を加えることができますか?あなたは文字列を返す必要がありますか?それは別のものになることができますか? – dbc

答えて

0

まあ、私は最善の解決策ではなく、一緒に文字列を渡すの直接、そして、私はファイルを渡し、ファイルにシリアライズすることがわかりました投稿...それはファイルをデシリアライズしています!

+0

'xmlWriter'も処分する必要があります。 –

+0

XmlWriterはIDisposableオブジェクトではありません。 –

+0

[1](https://msdn.microsoft.com/en-us/library/system.xml.xmlwriter(v = vs.110).aspx)、[2](https://msdn.microsoft.com /en-us/library/system.xml.xmlwriter.dispose(v=vs.110).aspx)。 –

関連する問題