2014-01-30 29 views
1

came across a factory class我不完全確定如何使用它,如果我想要替換下面的XmlSerializer代碼。XmlSerializer緩存工廠

標本模型

public class SampleData 
{ 
    public string Name { get; set; } 
    public string Country { get; set; } 
} 

現有代碼

List<SampleData> objects = new List<SampleData>(); 
objects.Add(new SampleData() { Country = "Australia", Name = "aus" }); 

StringWriter writer = new StringWriter(); 

XmlSerializer serializer = new XmlSerializer(typeof(List<SampleData>)); 
serializer.Serialize(writer, objects); 

工廠類

public static class CachingXmlSerializerFactory 
{ 
    private static readonly Dictionary<string, XmlSerializer> Cache = new Dictionary<string, XmlSerializer>(); 

    private static readonly object SyncRoot = new object(); 

    public static XmlSerializer Create(Type type, XmlRootAttribute root) 
    { 
     if (type == null) throw new ArgumentNullException("type"); 
     if (root == null) throw new ArgumentNullException("root"); 

     var key = String.Format(CultureInfo.InvariantCulture, "{0}:{1}", type, root.ElementName); 

     lock (SyncRoot) 
     { 
      if (!Cache.ContainsKey(key)) 
      { 
       Cache.Add(key, new XmlSerializer(type, root)); 
      } 
     } 

     return Cache[key]; 
    } 

    public static XmlSerializer Create<T>(XmlRootAttribute root) 
    { 
     return Create(typeof(T), root); 
    } 

    public static XmlSerializer Create<T>() 
    { 
     return Create(typeof(T)); 
    } 

    public static XmlSerializer Create<T>(string defaultNamespace) 
    { 
     return Create(typeof(T), defaultNamespace); 
    } 

    public static XmlSerializer Create(Type type) 
    { 
     return new XmlSerializer(type); 
    } 

    public static XmlSerializer Create(Type type, string defaultNamespace) 
    { 
     return new XmlSerializer(type, defaultNamespace); 
    } 
} 
+0

IIRC,'XmlSerializer'已經內部執行基於類型的緩存,因此一次又一次地爲相同類型實例化新的很快。你期望通過這種方式實現可衡量的性能提升嗎?編輯:什麼是你所嘗試過的具體問題? 「試圖使用以下無濟於事」並沒有太多幫助。 –

+0

對於表現的評論,Ahh無視我;這是關於內存泄漏(儘管根據我對'XmlSerializer'的經驗,我沒有遇到內存問題) –

+0

@ChrisSinclair爲了提高性能,XML序列化基礎結構動態生成程序集以序列化和反序列化指定的類型。基礎設施找到並重新使用這些程序集。 - 我沒有意識到它在內部根據類型執行緩存。我所追求的是限制可能發生的內存泄漏量。我們在一次應用程序運行中執行了很多'XmlSerialization'。 – fuzz

回答

7

重讀部該文章引自MSDN。您已經在使用高速緩存內部序列化程序的兩個構造函數之一,因此它不應導致內存泄漏。如果您正在使用其他構造函數之一,則需要擔心緩存XmlSerializer,但您不需要。沒有必要修復沒有損壞的東西。 ;-)