2012-05-10 5 views
7

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

たとえば、ユーザーが一部のリストコントロールで目的のxml要素を選択し、選択されていないすべての要素を除いて選択した要素のみをシリアル化することができます。あなたが持っているDataContractSerializerを使用しているときに実行時に一部のプロパティを無視します。

[DataMember] 
public List<Whatever> Items {get {...}} 

を::

おかげリストのシナリオについては

答えて

3

は、多分ちょうど異なった性質を持っているので、代わりのしかし

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

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

+0

ありがとう、Marc。たとえば、List のインスタンスがある場合、MyClassにはX、Y、Zという3つのプロパティがあり、リスト内の各アイテムに対してXとYプロパティのみを含め、Zを無視してこのリストをDataContractSerializerシリアライザは出力にXとYのみを含み、Z?を無視します。リストのすべての項目の一部のプロパティを除外したいだけです。上で指定したいくつかのオプションで可能ですか? – Joxi

+1

'X'と' Y'は直列化したいが 'Z'は直列化したくない場合。 (私が知る限り)DCSを**すべての**アイテムに適用する場合、つまり '[DataMember]'または '[IgnoreDataMember] 'を適切に選択することによってのみ利用可能です。 DCSは私の知る限り条件付きシリアル化を持っていません –

関連する問題