2015-04-07 4 views
0

Я использую Xsd2Code для сериализации моего объекта, чтобы сгенерировать Xml-файл.Xsd2Code serialize file OutOfMemoryException

Он отлично работает, только когда файл содержит много данных, я получаю OutOfMemoryException. Вот код, который я использовал для сериализации моего объекта:

/// Serializes current EntityBase object into an XML document 
/// </summary> 
// <returns>string XML value</returns> 
public virtual string Serialize() { 
    System.IO.StreamReader streamReader = null; 
    System.IO.MemoryStream memoryStream = null; 

    try { 
     memoryStream = new System.IO.MemoryStream(); 
     Serializer.Serialize(memoryStream, this); 
     memoryStream.Seek(0, System.IO.SeekOrigin.Begin); 
     streamReader = new System.IO.StreamReader(memoryStream); 
     return streamReader.ReadToEnd(); 
    } 
    finally { 
     if (streamReader != null) { 
      streamReader.Dispose(); 
     } 

     if (memoryStream != null) { 
      memoryStream.Dispose(); 
     } 
    } 
} 

Мой запрос здесь, как я могу продлить буфер памяти, или как я могу избежать такого исключения?

С уважением.

+0

Каков полный вывод 'ToString()' OutOfMemoryException', включая трассировку? У вас заканчивается память внутри 'Serializer.Serialize()' или внутри 'streamReader.ReadToEnd()'? – dbc

+0

1) Что вы делаете с XML-строкой после ее создания? 2) Если вы закончили сериализацию памяти для строки для вывода в файл или другой поток, почему бы не сериализовать непосредственно в поток? – dbc

+0

К сожалению, в последнее время авария происходит в streamReader.ReadToEnd(), фактически после сериализации объекта мне нужно получить строку xml, чтобы сохранить ее в базе данных, поэтому мне нужно использовать ReadToEnd() –

ответ

1

Вы не показывают полный ToString() выход OutOfMemoryException так что трудно сказать наверняка, насколько это поможет, но одна возможность было бы написать непосредственно в StringWriter без создания промежуточного MemoryStream, например так:

public virtual string Serialize() 
    { 
     return this.Serialize(Serializer); 
    } 

Использование метода расширения:

public static class XmlSerializerExtensions 
{ 
    class NullEncodingStringWriter : StringWriter 
    { 
     public override Encoding Encoding { get { return null; } } 
    } 

    public static string Serialize<T>(this T obj, XmlSerializer serializer = null, bool indent = true) 
    { 
     if (serializer == null) 
      serializer = new XmlSerializer(obj.GetType()); 
     // Precisely emulate the output of http://referencesource.microsoft.com/#System.Xml/System/Xml/Serialization/XmlSerializer.cs,2c706ead96e5c4fb 
     // - Indent by 2 characters 
     // - Suppress output of the "encoding" tag. 
     using (var textWriter = new NullEncodingStringWriter()) 
     { 
      using (var xmlWriter = new XmlTextWriter(textWriter)) 
      { 
       if (indent) 
       { 
        xmlWriter.Formatting = Formatting.Indented; 
        xmlWriter.Indentation = 2; 
       } 
       serializer.Serialize(xmlWriter, obj); 
      } 
      return textWriter.ToString(); 
     } 
    } 
} 

Вы могли бы также рассмотреть вопрос о ликвидации форматирование и отступы, чтобы сохранить больше строк памяти, установив indent = false.

Это уменьшит ваш пиковый объем памяти несколько, так как он полностью исключает необходимость иметь большой объем памяти MemoryStream в то же время, что и результирующая строка. Тем не менее, это не уменьшит потребность в пиковой памяти, поскольку память, занятая MemoryStream, будет пропорциональна памяти, полученной окончательным XML string.

Помимо этого, я могу предложить только попробовать stream directly to your database.

+0

@MoezRebai - вы можете также посмотрите, будет ли массив байтов возвращен ['MemoryStream.GetBuffer'] (https://msdn.microsoft.com/en-us/library/system.io.memorystream.getbuffer%28v=vs.110%29. aspx) могут быть записаны непосредственно в вашу базу данных без необходимости их преобразования в строку. – dbc

+0

спасибо за вашу помощь, но как всегда у меня такое же исключение –

+0

@MoezRebai - 1) можете ли вы предоставить полный вывод 'ToString() нового исключения, включая трассировку? 2) можете ли вы поделиться, как вы загружаете свой XML в базу данных? – dbc