2009-07-16 97 views
16

我有一個在Read/WriteXml方法中使用XmlSerializer的類。串行器目前是private readonly我應該讓這個XmlSerializer是靜態的嗎?

public class Foo : IXmlSerializable 
{ 
    private Bar _bar = new Bar(); 
    private readonly XmlSerializer serBar = new XmlSerializer (typeof (Bar)); 

    public void WriteXml (XmlWriter writer) 
    { 
     serBar.Serialize (writer, Bar); 
    } 
    // ... 
} 

我正在考慮使串行private static代替,這樣一個實例所有FOOS之間共享。這是一個好主意,還是可能存在問題?

回答

30

是的,這是一個好主意。不,它沒有任何問題。特別是,線程安全是一個問題 - 從MSDN documentation for XmlSerializer class

線程安全

此類型是線程安全的。

+2

啊,太好了,這將是除非SOMET接受的答案興新來了。 :) – mafu 2009-07-16 08:04:39

3

是的。一般來說,你會想爲你的所有序列化程序類執行此操作。它可以大大加快您的應用程序

做到這一點,最簡單的方法是:

public static class MySerializers { 
    public static XmlSerializer MyType = new XmlSerializer(typeof(MyType));  
} 

然後,當你需要一個串行器,你可以簡單地調用:

MySerializers.MyType 

還要注意的是,根據C#語義,靜態類在首次使用時被初始化,而不是在加載時。如果你想把所有的負載成本放在前面,你需要明確地訪問這個類。

+0

好主意,謝謝! +1 – mafu 2009-10-02 06:52:05

5

一種方法是創建一個XmlSerializers工廠和靜態引用它(或者作爲一個IoC參考),是這樣的:

public class XmlSerializerFactory 
{ 
    public XmlSerializer GetSerializerFor<T>() 
    { 
     lock (this) 
     { 
      Type typeOfT = typeof(T); 
      if (false == serializers.ContainsKey(typeOfT)) 
      { 
       XmlSerializer newSerializer = new XmlSerializer(typeOfT); 
       serializers.Add(typeOfT, newSerializer); 
      } 

      return serializers[typeOfT]; 
     } 
    } 

    private Dictionary<Type, XmlSerializer> serializers = new Dictionary<Type, XmlSerializer>(); 
} 
+0

非常低效。 PROGrand回答要好得多:鎖定T1不會阻塞T2。 – Vlad 2016-09-25 11:41:36

13

據尼爾 - 更加普遍,安全,採用泛型和只讀:

public static class Helper<T> 
{ 
    public static readonly XmlSerializer Serializer = new XmlSerializer(typeof(T)); 
} 

用途爲:

Helper<My>.Serializer 
相關問題