6

私は.NETXmlIgnoreAttributeを理解していますか?

XmlSerializerのSerializeメソッドに、パブリックフィールドまたはパブリック読み取り/書き込みプロパティ値をシリアル化しないように指示します。

それ:

  • XMLファイルに存在する場合、プロパティは逆シリアル化されますか?
  • プロパティは新しいXMLファイルにシリアル化されませんか?

私が尋ねている理由は、ファイル内のプロパティを、より多くのオプションを備えた新しいプロパティに置き換えたためです。古いプロパティは単純なブールプロパティであり、新しいプロパティは列挙型です。新しいプロパティを追加する前の古いプロパティの意味に従って、新しいプロパティの値をブール値に変換するように古いプロパティを変更しました。getとsetの両方が実装されています。

これにより、新しいプロパティを設定する古いプロパティを読み取ることで新しいファイルをサイレントにアップグレードでき、シリアル化時に新しいプロパティが追加されました。

ただし、古いプロパティを新しいxmlファイルから削除したいので、タグを付けたらどうなるのか[XmlIgnore]、古いxmlファイルは引き続き適切に逆シリアル化されてファイルからそのプロパティを読み取るのか、それとも完全に無視されるのか疑問に思いました。 ?

そうでない場合、次の変更は私が望むことをしますか?

[XmlAttribute("is-list")]
[DefaultValue(false)]
public bool IsList
{
    get { return false; }
    set {
        if (value)
            ListHandling = ListHandling.All;
    }
}

これにより、すべての新しいオブジェクトに対してfalseが返されます。これは、デフォルト値を指定したため無視されます。古いファイルに存在し、trueに設定すると、重要な新しいプロパティであるListHandlingプロパティが変更されます。

編集:テストの結果、両方のアプローチが私が望むことを実行しているように見えることを確認しました。ただし、上記の最初の動作が単なる実装の詳細なのか、それともドキュメントがそのように理解できるのかを知りたいので、質問は残しておきます。

4

1 に答える 1

4

プロパティに のタグを付けるとXmlIgnore無視されます。XmlSerializer がシリアル化アセンブリをビルドするときは考慮されません。したがって、逆シリアル化中に XmlIgnore-d プロパティは設定されず、デフォルト値のままになります。

サンプルプログラム (Snippet Compiler 用):

public static void RunSnippet()
{
  XmlSerializer ser = new XmlSerializer(typeof(Fie));
  Fie f = (Fie)(ser.Deserialize(new StringReader("<Fie><Bob>Hello</Bob></Fie>")));
  WL(f.Bob == null ? "null" : "something");
}

public class Fie
{
  [XmlIgnore]
  public string Bob { get; set; }
}

このプログラムnullからの出力は次のとおりです (また、Fie.Bob から XmlIgnore を削除すると、出力は次のようになりますsomething)。

編集に応じて編集:これは単なる実装の詳細ではありません。それは確かに属性の文書化された動作です。ドキュメントの備考セクション(最初の段落) から:「XmlIgnoreAttribute をクラスの任意のメンバーに適用すると、XmlSerializer はクラスのインスタンスをシリアル化または逆シリアル化するときにメンバーを無視します。」(強調追加)

于 2010-02-28T08:05:23.130 に答える