1

型指定された xmlserialize オブジェクトがたくさんあります:

class Serializer{

        static XmlSerializer serializerRequest_EnterVehicle = new XmlSerializer(typeof(Request_EnterVehicle));
        static XmlSerializer serializerRequest_Cancel = new XmlSerializer(typeof(Request_Cancel));
        static XmlSerializer serializerRequest_PrintInfo = new XmlSerializer(typeof(Request_PrintInfo));

    public string ObjToXML(object toSerialize)...
}

これらを実行時に作成する代わりに、アプリケーションの開始時に初期化したいと思います。これらはシリアライザ クラスの一部ですが、これが良い方法かどうかはわかりません。この種の初期化を行うためのより良い方法はありますか?これに関連する他のコストはありますか?

この初期化コストは static キーワードを使用して 1 回だけ実行されるという前提で正しいでしょうか?

編集: プロジェクトは、Windows モバイル 6.1 Pro デバイス用の .NET 3.5 Compact Framework プロジェクトです。

更新しました:

using System;

using System.Collections.Generic;
using System.Text;
using System.Xml.Serialization;

namespace SmartDevice_Proxy
{
    public sealed class TypedXMLSerializers
    {
        private static volatile TypedXMLSerializers instance;
        private static object syncRoot = new Object();

        //Implementation as Singleton
        static XmlSerializer serializerRequest_EnterVehicle = new XmlSerializer(typeof(Request_EnterVehicle));
        static XmlSerializer serializerRequest_Cancel = new XmlSerializer(typeof(Request_Cancel));
        static XmlSerializer serializerRequest_PrintInfo = new XmlSerializer(typeof(Request_PrintInfo));

        private TypedXMLSerializers() { }

        public static TypedXMLSerializers Instance
        {
            get
            {
                if (instance == null)
                {
                    lock (syncRoot)
                    {
                        if (instance == null)
                            instance = new TypedXMLSerializers();
                    }
                }

                return instance;
            }
        }
    }
}

スレッドセーフのためにこれをテストする必要があります。

4

3 に答える 3

1

シングルトンパターンを実装できます

リンク:http ://www.yoda.arachsys.com/csharp/singleton.html

于 2013-01-02T16:30:41.697 に答える
0

答えはイエスです。これらXmlSerializerの変数が静的でない場合、クラスclass Serializerを開始するたびに、そのクラス用に初期化されます。

それらが静的である場合、アプリケーションの開始時に必ずしも初期化されるとは限りません。静的メンバーまたは非静的メンバー (関数または変数) がclass Serializer最初に呼び出されるときに 1 回だけ初期化されます。

class Serializerアプリケーションの全過程で のインスタンスが 1 つしかない場合は、それらをstatic非静的に設定しても実際の違いはありません。

編集:

あなたのシナリオに基づいて、これに興味があるかもしれません:

C# でのシングルトンの実装

于 2013-01-02T16:24:52.657 に答える
0

それらを静的にすると、クラスがコードで初めて使用されるときにインスタンスが作成されます。これを行う際の唯一の追加のオーバーヘッドは、アプリケーションの実行中ずっとメモリが使用されることです。このクラスのインスタンスが数個しかない場合、パフォーマンスの向上は、このわずかなメモリ使用量よりもはるかに重要です。

さらに、コンパイル時にシリアル化アセンブリを生成することもできます。C# プロジェクトで、[プロパティ] に移動し、 [ビルド] タブに移動します。下部近くには、シリアライゼーション アセンブリの生成オプションがあります。これにより、sgen.exe ツールを使用してXmlSerializerアセンブリがプリコンパイルされます。コンパイル時に行われない場合、実行時に行われる何か。

MSDN のプロジェクト設定ドキュメント

于 2013-01-02T16:26:19.360 に答える