2012-05-10 3 views
7

Sto utilizzando DataContractSerializer per serializzare un oggetto in XML utilizzando l'attributo DataMember (solo le proprietà pubbliche sono serializzate).
È possibile ignorare dinamicamente alcune proprietà in modo che non vengano incluse nell'output XML?

Ad esempio, per consentire all'utente di selezionare gli elementi xml desiderati in alcuni controlli di lista e quindi di serializzare solo quegli elementi selezionati dall'utente escludendo tutto ciò che non è selezionato.Ignora alcune proprietà in fase di esecuzione quando si utilizza DataContractSerializer

Grazie

risposta

3

Per lo scenario di lista, forse solo avere una proprietà diversa, così invece di:

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

si hanno:

public List<Whatever> Items {get {...}} 

[DataMember] 
public List<Whatever> SelectedItems { 
    get { return Items.FindAll(x => x.IsSelected); } 

tuttavia, deserializzazione che sarebbe un dolore, come la tua lista avrebbe bisogno di nutrire in Articoli; se è necessario deserializzare, potrebbe essere necessario scrivere un elenco personalizzato complesso.


Come seconda idea; crea semplicemente una seconda istanza dell'oggetto con solo gli elementi che desideri serializzare; molto semplice ed efficace:

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` 

per quanto ne so, DataContractSerializer non supporta la serializzazione condizionale di membri.

Al livello proprietà individuale, questo è un'opzione se si utilizza XmlSerializer, anche se - per una proprietà, ad esempio, Foo, si aggiunge solo:

public bool ShouldSerializeFoo() { 
    // return true to serialize, false to ignore 
} 

o:

[XmlIgnore] 
public bool FooSpecified { 
    get { /* return true to serialize, false to ignore */ } 
    set { /* is passed true if found in the content */ } 
} 

Questi sono applicati esclusivamente come una convenzione basata sul nome.

+0

Grazie, Marc. Ad esempio, se ho un'istanza di Lista in cui MyClass ha tre proprietà X, Y e Z, sarebbe possibile includere solo le proprietà X e Y e ignorare Z per ogni elemento nell'elenco e quindi inviare questo elenco a DataContractSerializer e il serializzatore includerà solo X e Y nell'output e ignorerà Z? Voglio solo escludere alcune proprietà per ogni elemento nell'elenco. È possibile con alcune delle opzioni che hai specificato sopra? – Joxi

+1

Nel caso di voler serializzare 'X' e' Y' ma non 'Z'; con DCS che è disponibile solo (per quanto ne so) se si applica a ** tutti ** gli elementi, ovvero scegliendo '[DataMember]' o '[IgnoreDataMember]' appropriatamente; DCS non ha serializzazione condizionale per quanto ne so. –