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?

Antworten:


176

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.

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).


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.