2

管理者がアプリケーションの設定を変更するために編集できる XML ファイルにシリアル化される設定クラスとして使用しているクラスがあります。(設定は、許可されているよりも少し複雑App.configです。)

クラスを使用しXmlSerializerて XML ファイルを逆シリアル化し、プロパティ クラスを設定できるようにしたいのですが、クラス/アセンブリを使用する他の開発者がコードを介してプロパティを設定/変更できるようにしたくありません。XmlSerializer クラスでこれを実現できますか?

さらにいくつかの詳細を追加するには: この特定のクラスは Collection であり、FxCop によると、このクラスはXmlSerializer読み取り専用コレクションの逆シリアル化を特別にサポートしていますが、これ以上の情報を見つけることができませんでした。これが違反するルールの正確な詳細は次のとおりです。

ユーザーがバッキング ストアを完全に置き換えることができないように、コレクションを返すプロパティは読み取り専用にする必要があります。ユーザーは、コレクションで関連するメソッドを呼び出すことにより、コレクションの内容を変更できます。XmlSerializer クラスは、読み取り専用コレクションの逆シリアル化を特別にサポートしていることに注意してください。詳細については、XmlSerializer の概要を参照してください。

これはまさに私が欲しいものですが、どうすればいいですか?

編集: OK、私はここで少し頭がおかしくなっていると思います。私の場合は、コンストラクターで Collection オブジェクトを初期化し、プロパティ セッターを削除するだけで済みました。次に、XmlSerializable オブジェクトは、Collection オブジェクトで Add/AddRange およびインデクサー プロパティを使用することを実際に認識します。以下は実際に動作します!

public class MySettings
{
    private Collection<MySubSettings> _subSettings;
    public MySettings()
    {
       _subSettings = new Collection<MySubSettings>();
    }

    public Collection<MySubSettings> SubSettings
    {
         get { return _subSettings; }
    }
}
4

4 に答える 4

4

ArrayList (または IList IIRC) のような変更可能なリスト型を使用する必要があります。

于 2008-09-25T14:46:26.903 に答える
1

プロパティは読み取り専用であるため、自動シリアル化を使用できるとは思いません。

私の行動方針は、ISerializableインターフェイスを実装して手動で行うことです。ここから内部値を設定できます。

ただし、サブオブジェクト (読み取り専用として公開されている) が自分自身のシリアル化を処理できる場合は、すべて正常に機能するはずです..

FxCopがうめき声を上げているルールは、次のようなものがあるということだと思います。

public List<MyObject> Collection
{
   get { return _collection; }
   set { _collection = value; }
}

そうじゃない?そうでない場合は、コードを貼り付けて、何をしているのかを正確に確認できますか? 上記のすべてを行うにはいくつかの方法があります:)

于 2008-09-25T14:44:53.227 に答える
1

@Rob Cooper は正しく、ISerializableインターフェースを実装するだけで、クラスがどのようにシリアライズおよびデシリアライズし、フィールドを手動で設定するかをカスタム制御できます。もう少し手間がかかりますが、目的の目標を達成できます。幸運を。

于 2008-09-25T15:03:20.450 に答える
0

@leppieの応答は実際に最も近いものでした。これは、XmlSerializerドキュメントの実際の関連テキストであり、詳細については、上記の質問に対する私の編集を参照してください。

XmlSerializerは、IEnumerableまたはICollectionを実装するクラスに特別な処理を提供します。IEnumerableを実装するクラスは、単一のパラメーターを受け取るパブリックAddメソッドを実装する必要があります。Addメソッドのパラメーターは、GetEnumeratorから返された値のCurrentプロパティから返されるものと同じタイプ、またはそのタイプのベースの1つである必要があります。IEnumerableに加えてICollection(CollectionBaseなど)を実装するクラスには、整数を取るpublic Itemインデックス付きプロパティ(C#のインデクサー)が必要であり、整数型のpublicCountプロパティが必要です。Addメソッドのパラメーターは、Itemプロパティから返されるものと同じタイプ、またはそのタイプのベースの1つである必要があります。ICollectionを実装するクラスの場合、シリアル化される値は、インデックス付けされたItemプロパティから取得されます。

于 2008-09-25T15:10:33.057 に答える