0

Я управляю большим проектом и нуждаюсь в сериализации и отправке объекта в формате xml. Объект ~ 130 мб.C# serialization xmlwriter stringwriter из памяти для большого объектаhelp

(ПРИМЕЧАНИЕ. Я не писал этот проект, поэтому редактирование вне этого метода или радикальное изменение архитектуры не является вариантом. Оно работает нормально, но когда объект является таким большим, он выдает из памяти . исключение мне нужно сделать, это еще один способ для обработки больших объектов)

текущий код заключается в следующем:.

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; 
} 

Он бросает аут исключения памяти прямо на 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()); 
      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; 
    } 

исследование это, кажется, метод ToString на StringWriter фактически использует двойную оперативную память. (На самом деле у меня много свободного места в памяти, более 4 ГБ, поэтому я не уверен, почему я получаю ошибку из памяти).

+0

Является ли приложение построено для 'x86', 'x64' или 'Any CPU'. Если платформа сборки x86, то ваше .net-приложение работает как 32-битный процесс, хотя у вас есть 64-битная среда и вы можете получить доступ к большему количеству памяти, если она будет работать как x64. –

+0

Это x86, и я не могу это изменить. Но все же, это 130 мега объектов, поэтому в любом случае он не выходит за пределы памяти x86. –

+0

На 32 бит практический предел того, сколько * смежной * памяти вы можете выделить, намного меньше теоретического предела 2 ГБ. Например, http://stackoverflow.com/questions/2415434/the-limitation-on-the-size-of-net-array/2415472#2415472. Какие изменения вы можете внести в этот код? Вам нужно вернуть строку? Может быть, это что-то еще? – dbc

ответ

0

Ну, я обнаружил, что наилучшим решением для сериализации в файл напрямую, то вместо того, чтобы передать строку вместе, я передаю файл:

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(); 
       } 
      } 
     } 
    } 
} 

Конечно, теперь у меня есть еще одна проблема, с которой я буду post ... и это десериализация файла!

+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). –