DataContractSerializer: Wie werden Klassen / Member ohne DataContract / DataMember-Attribute serialisiert?

datacontractserializer efpocoadapter entity-framework serialization

Frage

DataContractSerializer erfordert Klassen und Mitglieder mit markiert werden die DataContract und DataMember Attribute. In meinem Fall werden die Klassen jedoch automatisch mit dem EFPocoAdapater-Framework generiert, und diese Attribute sind nicht vorhanden.

Wie erzwinge ich die Serialisierung aller Mitglieder mit dem DataContractSerializer, ohne dass diese Attribute vorhanden sind?

Von Alexdej:

Das hat sich in 3.5SP1 geändert. Ich hoffe, Sie haben folgendes gesehen: http://www.pluralsight.com/community/blogs/aaron/archive/2008/05/13/50934.aspx

Akzeptierte Antwort

Sie können nicht - schlicht und einfach. Das Attribut wird für den DataContractSerializer benötigt, um die zu serialisierenden Elemente zu ermitteln. In Übereinstimmung mit dem XmlSerializer, der im Wesentlichen nur alles serialisiert (sofern Sie nicht ausdrücklich sagen, dass er es ignorieren soll), ist der DataContractSerializer "opt-in" - Sie müssen ihm (anhand der Attribute) explizit mitteilen, welche Felder und / oder Eigenschaften er hat serialisieren.

AKTUALISIERUNG: Wie mehrere Leute darauf hingewiesen haben, hat Microsoft mit .NET 3.5 SP1 diese Regeln etwas gelockert. Jede öffentliche Lese- / Schreibeigenschaft wird vom DataContractSerializer automatisch serialisiert. Zur gleichen Zeit muss Ihre Klasse auch einen parameterlosen Standardkonstruktor haben - klingt nach den genauen Anforderungen, die wir für XmlSerializer hatten, als ...

Natürlich das:

  • Erlaubt Ihnen nicht, etwas privates zu serialisieren - wenn Sie es serialisieren möchten, müssen Sie es als öffentliche Lese- / Schreibeigenschaft verfügbar machen
  • Es ist nicht möglich, eine definierte Reihenfolge der Parameter festzulegen. Sie werden nur in der Reihenfolge verwendet, in der sie in der Klasse angezeigt werden
  • Jetzt müssen Sie zur Deserialisierung wieder einen parameterlosen Konstruktor in Ihrer Klasse haben

Ich denke immer noch, dass diese Dinge explizit und klar sein sollten. Dadurch wird der Weg für faule / schlampige Programmierung geöffnet - das gefällt mir nicht. Wenn Sie möchten, können Sie es jetzt verwenden, ohne Ihre Eigenschaften explizit mit [DataMember] zu kennzeichnen.

Marc


Beliebte Antwort

Markieren Sie die Klasse einfach mit dem Attribut [Serializable]. Alle Mitglieder, die nicht serialisiert werden sollen, werden mit [Nicht serialisiert] markiert. Beachten Sie, dass bei [Serializable] standardmäßig alle Felder serialisiert werden, wobei [DataContract] standardmäßig keine Felder serialisiert, außer den mit [DataMember] markierten.



Related

Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum