Come posso ignorare una proprietà durante la serializzazione utilizzando DataContractSerializer?


125

Sto usando .NET 3.5SP1 e DataContractSerializer per serializzare una classe. In SP1, hanno modificato il comportamento in modo che non sia necessario includere gli attributi DataContract / DataMember nella classe e serializzerà semplicemente l'intera cosa. Questo è il comportamento che sto usando, ma ora devo ignorare una proprietà dal serializzatore. So che un modo per farlo è aggiungere l'attributo DataContract alla classe e inserire semplicemente l'attributo DataMember su tutti i membri che voglio includere. Ho ragioni, tuttavia, che questo non funzionerà per me.

Quindi la mia domanda è: esiste un attributo o qualcosa che posso usare per fare in modo che DataContractSerializer ignori una proprietà?

Risposte:


176

5
Il mio livello di dominio non aveva il corretto riferimento all'assembly, quindi ho letto male la documentazione e ho finito per pensare che fosse una nuova funzionalità di .NET 4.5. Ho provato a ritrovare questo thread per eliminare il mio commento senza successo (avevo fretta). Inoltre, guardare la data di questa risposta avrebbe dovuto suonare un campanello .... Post .NET 4.5 2009 ...) Ci scusiamo per aver perso tempo.
Pluc

2
Su .NET 4.5 qui: System.Runtime.Serialization.IgnoreDataMemberAttribute funziona per qualsiasi cosa
SparK

1
Anche le librerie di terze parti hanno aggiunto il supporto per [IgnoreDataMember], come JSON.NET.
Doug il

5
Un breve esempio non renderebbe questa una risposta effettivamente degna dei voti?
TaW

1
Questa risposta è incompleta e quindi fuorviante. [IgnoreDataMember]non funzionerebbe se la classe avesse un [Serializable]attributo. Vedi i dettagli nella risposta di Doug .
Alex Fainshtein

165

Inoltre, DataContractSerializer serializzerà gli elementi contrassegnati come [Serializable] e serializzerà anche i tipi non contrassegnati in .NET 3.5 SP1 e versioni successive, per consentire il supporto per la serializzazione dei tipi anonimi.

Quindi, dipende da come hai decorato la tua classe su come impedire a un membro di serializzare:

  • Se hai usato [DataContract], rimuovi il [DataMember]per la proprietà.
  • Se lo hai utilizzato [Serializable], aggiungi [NonSerialized]davanti al campo della proprietà.
  • Se non hai decorato la tua classe, dovresti aggiungere [IgnoreDataMember]alla proprietà.

1
cosa intendevi per "decorato la tua classe", spieghi?
alamin

Se non hai utilizzato alcun attributo sulla tua classe, come [DataContract] o [Serializable], dovresti aggiungere [IgnoreDataMember] alla proprietà che non desideri serializzare. Vedi la risposta di Paul o checkoutall.com/Blog/Index/201410240204236271/…
Doug

8
Questo è molto più informativo della risposta accettata.
pvgoran

C'è un modo per ignorare quel membro e continuare a serializzare la struttura / classe dei dati?
ryanwebjackson

Che ne dici di escludere una PROPRIETÀ quando è stato utilizzato [Serializable]?
Daniel

31

Nella serializzazione XML, è possibile utilizzare l'attributo [XmlIgnore] (System.Xml.Serialization.XmlIgnoreAttribute) per ignorare una proprietà durante la serializzazione di una classe.

Questo potrebbe esserti utile (o potrebbe essere utile a chiunque abbia trovato questa domanda quando ha tentato di scoprire come ignorare una proprietà durante la serializzazione in XML, come lo ero io).


4
Ah voto negativo. Ho pensato di pubblicarlo perché quando ho cercato come ignorare una proprietà durante la serializzazione di una classe, è venuto fuori questo post. E volevo metterlo qui se qualcuno avesse trovato questo post nello stesso modo in cui l'ho fatto io.
Kris Adams

[in meta] Penso che abbiano votato negativo perché dovresti aprire un'altra domanda (più specifica) su XMLSerialization e rispondere, in modo che le persone trovino quella domanda più pertinente nella loro ricerca
SparK

8
Questa risposta è esattamente quello che stavo cercando
aclave1


0

Quello che stai dicendo è in conflitto con quello che dice nella libreria MSDN in questa posizione:

http://msdn.microsoft.com/en-us/library/system.runtime.serialization.datacontractserializer.aspx

Non vedo alcuna menzione della funzione SP1 di cui parli.


1
È possibile trovare il documento qui (3 ° comma, 2 ° periodo): msdn.microsoft.com/en-us/library/ms733127.aspx
NotDan

Hai ragione sul link che hai pubblicato, però, non sono sicuro del motivo per cui non lo menzionano anche lì.
NotDan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.