DataContractSerializer を使用して、DataMember 属性を使用してオブジェクトを XML にシリアル化しています (パブリック プロパティのみがシリアル化されます)。
一部のプロパティを動的に無視して、XML 出力に含めないようにすることはできますか?
たとえば、ユーザーが一部のリスト コントロールで必要な xml 要素を選択できるようにし、選択されていないすべての要素を除外して、ユーザーが選択した要素のみをシリアル化できるようにします。
ありがとう
DataContractSerializer を使用して、DataMember 属性を使用してオブジェクトを XML にシリアル化しています (パブリック プロパティのみがシリアル化されます)。
一部のプロパティを動的に無視して、XML 出力に含めないようにすることはできますか?
たとえば、ユーザーが一部のリスト コントロールで必要な xml 要素を選択できるようにし、選択されていないすべての要素を除外して、ユーザーが選択した要素のみをシリアル化できるようにします。
ありがとう
リストのシナリオでは、おそらく別のプロパティを持っているだけなので、代わりに:
[DataMember]
public List<Whatever> Items {get {...}}
あなたが持っている:
public List<Whatever> Items {get {...}}
[DataMember]
public List<Whatever> SelectedItems {
get { return Items.FindAll(x => x.IsSelected); }
ただし、リストをアイテムにフィードする必要があるため、逆シリアル化は面倒です。逆シリアル化も必要な場合は、複雑なカスタム リストを作成する必要がある場合があります。
2番目のアイデアとして; シリアライズしたい項目だけでオブジェクトの 2 番目のインスタンスを作成するだけです。非常にシンプルで効果的:
var dto = new YourType { X = orig.X, Y = orig.Y, ... };
foreach(var item in orig.Items) {
if(orig.Items.IsSelected) dto.Items.Add(item);
}
// now serialize `dto`
私の知る限り、DataContractSerializer
メンバーの条件付きシリアル化はサポートされていません。
個々のプロパティレベルでは、これはを使用している場合のオプションですがXmlSerializer
、たとえば をプロパティにFoo
追加するだけです。
public bool ShouldSerializeFoo() {
// return true to serialize, false to ignore
}
また:
[XmlIgnore]
public bool FooSpecified {
get { /* return true to serialize, false to ignore */ }
set { /* is passed true if found in the content */ }
}
これらは、純粋に名前ベースの規則として適用されます。