8

DataContractSerializer を使用して、DataMember 属性を使用してオブジェクトを XML にシリアル化しています (パブリック プロパティのみがシリアル化されます)。
一部のプロパティを動的に無視して、XML 出力に含めないようにすることはできますか?

たとえば、ユーザーが一部のリスト コントロールで必要な xml 要素を選択できるようにし、選択されていないすべての要素を除外して、ユーザーが選択した要素のみをシリアル化できるようにします。

ありがとう

4

2 に答える 2

3

リストのシナリオでは、おそらく別のプロパティを持っているだけなので、代わりに:

[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 */ }
}

これらは、純粋に名前ベースの規則として適用されます。

于 2012-05-10T07:08:45.657 に答える
1

無視データメンバー属性があります

于 2012-05-10T07:12:20.503 に答える