24 Stimmen

Sollte ich diesen XmlSerializer statisch machen?

Ich habe eine Klasse, die eine XmlSerializer in seinem Read/WriteXml Methoden. Der Serialisierer ist derzeit private readonly .

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);
    }
    // ...
}

Ich erwäge, den Serializer zu machen private static statt, so dass eine Instanz von allen Foos gemeinsam genutzt wird. Ist dies eine gute Idee, oder gibt es mögliche Probleme?

41voto

Pavel Minaev Punkte 97251

Ja, das ist eine gute Idee. Nein, es gibt keine Probleme damit. Insbesondere die Fadensicherheit ist pas ein Thema - von MSDN-Dokumentation für XmlSerializer Klasse :

Gewinde Sicherheit

Dieser Typ ist thread-sicher.

16voto

PROGrand Punkte 186

Laut Neal - noch universeller und sicherer durch Generics und Readonly:

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

Verwendung als:

Helper<My>.Serializer

7voto

Igor Brejc Punkte 18057

Eine Möglichkeit wäre, eine XmlSerializers-Fabrik zu erstellen und sie statisch zu referenzieren (oder als IoC-Referenz), etwa so:

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>();
}

4voto

Neal Tibrewala Punkte 435

Ja, im Allgemeinen sollten Sie dies für alle Ihre Serializer-Klassen tun. Es kann Ihre Anwendung dramatisch beschleunigen

Am einfachsten ist es, dies zu tun:

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

Wenn Sie dann einen Serialisierer benötigen, können Sie ihn einfach aufrufen:

MySerializers.MyType

Beachten Sie auch, dass statische Klassen gemäß der C#-Semantik bei der ersten Verwendung initialisiert werden, nicht zur Ladezeit. Wenn Sie alle Ladekosten im Voraus setzen wollen, müssen Sie explizit auf die Klasse zugreifen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X