2016-12-01 1 views
1

У меня есть этот метод:Где утечка памяти (Сериализация объекта)

public static string XmlSerialize<T>(T data) 
{ 
    string result; 
    using (StringWriter stringWriter = new StringWriter()) 
    { 
     XmlWriterSettings settings = new XmlWriterSettings 
     { 
      Encoding = Encoding.UTF8, 
      OmitXmlDeclaration = true, 
     }; 
     using (XmlWriter writer = XmlWriter.Create(stringWriter, settings)) 
     { 
      XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
      ns.Add("", ""); 
      XmlSerializer serializer = XmlSerializer.FromTypes(new[] { typeof(T) })[0]; 
      serializer.Serialize(writer, data, ns); 
     } 
     result = stringWriter.ToString(); 
    } 

    return result; 
} 

Это простой метод для сериализации объекта в XML. Но этот метод имеет утечку памяти, и я не знаю, где это.

Может ли кто-нибудь помочь мне найти его?

+3

Почему вы решили, что этот метод имеет утечку памяти? Что заставляет вас думать так? –

+1

Невозможно увидеть что-нибудь здесь, которое не может быть обработано GC при выходе из метода. Так почему вы думаете, что * есть * утечка памяти? – HimBromBeere

+0

Потому что, когда я использовал этот метод для сериализации одного объекта 10 000 раз, память, используемая программой до 100 МБ (от 10 МБ). – Lasoty

ответ

-1

Вы должны освободить ресурсы из памяти с помощью метода Dispose(), потому что сборщик мусора C# не делает этого, чтобы какой-либо объект имел метод Dispose().

public static string XmlSerialize<T>(T data) 
{ 
string result; 
using (StringWriter stringWriter = new StringWriter()) 
{ 
    XmlWriterSettings settings = new XmlWriterSettings 
    { 
     Encoding = Encoding.UTF8, 
     OmitXmlDeclaration = true, 
    }; 
    using (XmlWriter writer = XmlWriter.Create(stringWriter, settings)) 
    { 
     XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
     ns.Add("", ""); 
     XmlSerializer serializer = XmlSerializer.FromTypes(new[] { typeof(T) })[0]; 
     serializer.Serialize(writer, data, ns); 
     if (writer != null) 
      writer.Dispose(); 
    } 
    result = stringWriter.ToString(); 
    if (stringWriter != null) 
     stringWriter.Dispose(); 
} 

return result; 
} 
+0

Может ли быть так, что использование «ИСПОЛЬЗОВАНИЯ» это не согласуется? – Lasoty

+1

В конце «использования» блока Dispose вызывается автоматически. –

+1

Это неверно, используемый блок вызовет 'Dispose' на объект, когда он покинет область видимости. Он также считается более безопасным, так как он обычно вызывается 'Dispose', даже если выбрано исключение. – TheLethalCoder