2015-09-18 4 views
0

У меня есть статическая функция для сериализации документа Xml определенного типа ввода. Ниже приведены подходы:Инициализировать переменную несколько раз

Approach 1. 
public static XmlDocument SerializeToXmlDocument<T>(this T o) 
{ 
     XmlDocument xmlDoc = new XmlDocument(); 

     using (XmlWriter writer = xmlDoc.CreateNavigator().AppendChild()) 
     { 
      XmlSerializer xmls = new XmlSerializer(typeof(T)); 
      xmls.Serialize(writer, o); 
     } 

     return xmlDoc; 
} 

Approach 2. 
static XmlSerializer xmls; 
public static XmlDocument SerializeToXmlDocument<T>(this T o) 
{ 
     XmlDocument xmlDoc = new XmlDocument(); 

     using (XmlWriter writer = xmlDoc.CreateNavigator().AppendChild()) 
     { 
      if (xmls == null || xmls.GetType() != typeof(T)) 
      { 
       xmls = new XmlSerializer(typeof(T)); 
      } 
      xmls.Serialize(writer, o); 
     } 

     return xmlDoc; 
} 

Этот метод вызывается из различных страниц, так что тип может быть различным.

Какой я должен использовать, учитывая минимальное использование памяти. Также, как утверждает мой архитектор, XmlSerializer не собирается GC, он остается там. Приходится работать только с этим допущением.

Q.1) Какой подход лучше, и почему?

Q.2) А также, что произойдет, если я инициализирую одну переменную много раз. Конструктор каждый раз назначает память объекту. Но объект имеет ссылку, поэтому он будет получать одинаковое пространство памяти каждый раз или другое.

+0

Это вопрос домашнего задания? – Jon

+0

Нет, это ситуация в реальном времени. –

ответ

0

Подход 2 не является потокобезопасным, так что, вероятно, это приведет к неприятностям позже.

Я бы использовал подход 1, и только если есть проблема с производительностью, рассмотрим какой-то подход 2 (но затем поточно-безопасный).

+0

Это может быть утечка памяти, потому что XmlSerializer остается там в памяти и не уходит (собирается GC). Итак, что произойдет, если я инициализирую одну переменную много раз. Конструктор будет каждый раз присваивать память объекту или он получает такое же пространство памяти каждый раз, когда ссылка такая же? –

+0

Согласно [this] (https://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer%28v=vs.110%29.aspx) странице в msdn (абзац «динамически» генерирует сборки »), если вы используете этот конструктор (с аргументом типа), это не должно быть проблемой. –

+0

О, потрясающе это помогает! Это также объясняет, почему XmlSerializer не собирается GC. –

Смежные вопросы