2009-07-16 14 views
16

मुझे एक कक्षा मिली है जो Read/WriteXml विधियों में XmlSerializer का उपयोग करती है। Serializer वर्तमान में 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); 
    } 
    // ... 
} 

मैं बजाय Serializer private static बनाने पर विचार कर रहा हूँ, तो एक उदाहरण सभी Foos के बीच साझा किया जाता है। क्या यह एक अच्छा विचार है, या क्या संभावित मुद्दे हैं?

उत्तर

30

हां, यह एक अच्छा विचार है। नहीं, इसके साथ कोई समस्या नहीं है।

थ्रेड सुरक्षा

इस प्रकार का धागा सुरक्षित है: MSDN documentation for XmlSerializer class से - विशेष रूप से, धागा सुरक्षा नहीं एक मुद्दा है।

+2

आह, महान, इस जब तक somet स्वीकार किए जाते हैं जवाब होने जा रहा है हिंग नया आता है। :) – mafu

3

हां। आम तौर पर आप इसे अपने सभी धारावाहिक वर्गों के लिए करना चाहेंगे। यह नाटकीय रूप से

सबसे आसान तरीका है यह करने के लिए अपने आवेदन में तेजी लाने के कर सकते हैं:

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

फिर जब आप एक serializer जरूरत है तो आप बस फोन कर सकते हैं:

MySerializers.MyType 

भी ध्यान रखें कि सी # के अनुसार अर्थशास्त्र, स्थिर वर्गों को पहले उपयोग पर शुरू किया जाता है, लोड-समय पर नहीं। यदि आप सभी लोड लागत को सामने रखना चाहते हैं, तो आपको कक्षा को स्पष्ट रूप से एक्सेस करना होगा।

+0

अच्छा विचार, धन्यवाद! +1 – mafu

5

एक तरह से एक XmlSerializers कारखाना बनाने और इसे स्थिर संदर्भ के लिए (या एक आईओसी संदर्भ के रूप में) हो सकता है, की तरह कुछ:

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 उत्तर बहुत बेहतर है: टी 1 पर लॉकिंग टी 2 को अवरुद्ध नहीं करेगा। – Vlad

13

नील के अनुसार - और भी सार्वभौमिक और सुरक्षित जेनेरिक्स के माध्यम से और केवल पढ़ने के लिए:

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

उपयोग के रूप में:

Helper<My>.Serializer 
संबंधित मुद्दे