24

XmlSerializerメソッドでを使用するクラスがありRead/WriteXmlます。シリアライザーは現在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);
    }
    // ...
}

代わりにシリアライザーを作成することを検討しているprivate staticため、1 つのインスタンスがすべての Foo で共有されます。これは良い考えですか、それとも考えられる問題はありますか?

4

4 に答える 4

40

はい、それは良い考えです。いいえ、問題はありません。特に、スレッド セーフは問題ではありません- classの MSDN ドキュメントXmlSerializerから:

スレッドセーフ

この型はスレッドセーフです。

于 2009-07-16T07:54:14.513 に答える
16

ニールによると-ジェネリックスと読み取り専用により、さらに普遍的で安全です:

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

使用:

Helper<My>.Serializer
于 2012-04-17T10:42:19.970 に答える
7

1 つの方法は、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>();
}
于 2010-01-19T08:42:32.080 に答える
4

はい。一般に、すべてのシリアライザ クラスに対してこれを行う必要があります。アプリケーションを劇的に高速化できます

これを行う最も簡単な方法は次のとおりです。

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

次に、シリアライザーが必要な場合は、次のように呼び出すだけです。

MySerializers.MyType

また、C# のセマンティクスに従って、静的クラスは読み込み時ではなく、最初の使用時に初期化されることに注意してください。すべてのロード コストを前払いしたい場合は、クラスに明示的にアクセスする必要があります。

于 2009-09-17T22:51:37.620 に答える