Wie kann ich eine Eigenschaft bei der Serialisierung mit dem DataContractSerializer ignorieren?

124

Ich verwende .NET 3.5SP1 und DataContractSerializer, um eine Klasse zu serialisieren. In SP1 haben sie das Verhalten so geändert, dass Sie keine DataContract / DataMember-Attribute in die Klasse aufnehmen müssen, und es wird nur das gesamte Objekt serialisiert. Dies ist das Verhalten, das ich verwende, aber jetzt muss ich eine Eigenschaft aus dem Serializer ignorieren. Ich weiß, dass eine Möglichkeit, dies zu tun, darin besteht, der Klasse das DataContract-Attribut hinzuzufügen und einfach das DataMember-Attribut auf alle Mitglieder zu setzen, die ich einschließen möchte. Ich habe jedoch Gründe, dass dies bei mir nicht funktionieren wird.

Meine Frage ist also, gibt es ein Attribut oder etwas, mit dem der DataContractSerializer eine Eigenschaft ignorieren kann?

NotDan
quelle

Antworten:

176

IgnoreDataMemberAttribute ?

Paul Ruane
quelle
5
Meine Domänenschicht hatte nicht die richtige Assemblyreferenz, dann habe ich die Dokumentation falsch gelesen und dachte, es sei eine neue Funktion von .NET 4.5. Ich habe versucht, diesen Thread wiederzufinden, um meinen Kommentar ohne Erfolg zu löschen (hatte es eilig). Außerdem hätte ein Blick auf das Datum dieser Antwort eine Glocke läuten müssen .... 2009 .NET 4.5-Beitrag ...) Entschuldigen Sie, dass Sie Ihre Zeit verschwendet haben.
Pluc
2
Unter .NET 4.5 hier: System.Runtime.Serialization.IgnoreDataMemberAttribute funktioniert für alles
SparK
1
Sogar Bibliotheken von Drittanbietern haben Unterstützung für [IgnoreDataMember] hinzugefügt, wie z. B. JSON.NET.
Doug
5
Wäre ein kurzes Beispiel nicht eine Antwort, die tatsächlich die Stimmen wert ist?
TaW
1
Diese Antwort ist unvollständig und daher irreführend. [IgnoreDataMember]würde nicht funktionieren, wenn die Klasse ein [Serializable]Attribut hat. Siehe Details in der Antwort von Doug .
Alex Fainshtein
164

Darüber hinaus serialisiert DataContractSerializer Elemente, die als [Serializable] gekennzeichnet sind, und serialisiert auch nicht markierte Typen in .NET 3.5 SP1 und höher, um die Unterstützung für die Serialisierung anonymer Typen zu ermöglichen.

Es hängt also davon ab, wie Sie Ihre Klasse dekoriert haben, um zu verhindern, dass ein Mitglied serialisiert:

  • Wenn Sie verwendet haben [DataContract], entfernen Sie das [DataMember]für die Eigenschaft.
  • Wenn Sie verwendet haben [Serializable], fügen Sie [NonSerialized]vor dem Feld für die Eigenschaft hinzu.
  • Wenn Sie Ihre Klasse nicht dekoriert haben, sollten Sie [IgnoreDataMember]das Anwesen erweitern.
Doug
quelle
1
Was meinten Sie mit "dekoriert Ihre Klasse" pls erklären?
Alamin
Wenn Sie in Ihrer Klasse keine Attribute wie [DataContract] oder [Serializable] verwendet haben, fügen Sie der Eigenschaft, die Sie nicht serialisieren möchten, [IgnoreDataMember] hinzu. Siehe Pauls Antwort oder checkoutall.com/Blog/Index/201410240204236271/…
Doug
7
Dies ist viel informativer als die akzeptierte Antwort.
Pvgoran
Gibt es eine Möglichkeit, dieses Mitglied zu ignorieren und die Datenstruktur / -klasse weiter zu serialisieren?
Ryanwebjackson
Wie wäre es, ein EIGENTUM auszuschließen, wenn [Serializable] verwendet wurde?
Daniel
31

Bei der XML-Serialisierung können Sie das Attribut [XmlIgnore] (System.Xml.Serialization.XmlIgnoreAttribute) verwenden, um eine Eigenschaft beim Serialisieren einer Klasse zu ignorieren.

Dies kann für Sie von Nutzen sein (oder nur für jeden, der diese Frage gefunden hat, als er versucht hat, herauszufinden, wie eine Eigenschaft beim Serialisieren in XML ignoriert werden kann, wie ich es war).

Kris Adams
quelle
4
Ah negative Abstimmung. Ich dachte nur, ich würde das posten, denn als ich nach einer Möglichkeit suchte, eine Eigenschaft beim Serialisieren einer Klasse zu ignorieren, kam dieser Beitrag. Und ich wollte es hier einfügen, wenn jemand diesen Beitrag genauso fand wie ich.
Kris Adams
[in Meta] Ich denke, sie haben negativ gestimmt, weil Sie eine andere (spezifischere) Frage zu XMLSerialization öffnen und beantworten sollten, damit die Leute diese Frage bei ihrer Suche relevanter finden
SparK
8
Diese Antwort ist genau das, wonach ich gesucht habe
aclave1
0

Was Sie sagen, steht im Widerspruch zu dem, was in der MSDN-Bibliothek an diesem Speicherort steht:

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

Ich sehe keine Erwähnung der von Ihnen erwähnten SP1-Funktion.

Tony der Löwe
quelle
1
Sie finden das Dokument hier (3. Absatz, 2. Satz): msdn.microsoft.com/en-us/library/ms733127.aspx
NotDan
Sie haben Recht mit dem Link, den Sie gepostet haben. Ich bin mir nicht sicher, warum sie ihn dort auch nicht erwähnen.
NotDan