xmlignoreAttribute、シリアル化中にのみ使用され、脱出中には使用していませんか?
-
23-09-2019 - |
質問
.netを理解するのは正しいですか xmlignoreAttribute, 、言う:
XMLSerializerのシリアル化方法に、パブリックフィールドまたはパブリックの読み取り/書き込みプロパティ値をシリアル化しないように指示します。
それ:
- 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に設定すると、重要な新しいプロパティが変更されます。
編集: :テストすると、両方のアプローチが自分が望むことをしているように見えることを確認しました。ただし、上記の最初の動作が単なる実装の詳細であるかどうか、またはドキュメントをそのように理解できるかどうかを知りたいので、質問を残します。
解決
プロパティにタグを付けた場合 XmlIgnore
, 、そうです 無視した. 。 XMLSerializerがシリアル化アセンブリを構築するときは考慮されません。したがって、Xmlignore-Dプロパティは、脱出中に入力されず、デフォルト値が残されます。
サンプルプログラム(スニペットコンパイラ用):
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はシリアル化時にメンバーを無視します または脱isizing クラスのインスタンス。」(強調が追加されました)