2016-08-14 1 views
1

Jedes Mal wenn ich dieses Attribut treffen, sehe ich immer solche Nutzung:Vertrauliches Verhalten von DataContract?

[DataContract] 
class DataTransferObject 
{ 
    [DataMember] 
    public int Value {get;set;} 
} 

Und in diesem Beispiel alle geerbten Mitglieder auf jede Eigenschaft oder ein Feld Datamember-Attribut gelten sollte, dies zu sehr ungeschickt und poilerplate Code führen kann. Aber vor kurzem fand ich (vielleicht geheime Funktion?) Eine sehr elegante Art und Weise, es zu benutzen:

[DataContract] 
public abstract class DTOBase 
{ 
} 

public class MyDTO : DTOBase 
{ 
    public int Value {get;set;} 

    public MyDTO(){} //important part is here 
} 

Wichtiger Teil: Sie sollten immer explizit parameterlosen Konstruktor definieren, sonst wird es nicht richtig serialisiert.

Und ja. Es wird serialisieren alle seine öffentlichen Mitglieder, egal wie tief Vererbung sein wird, ohne die Notwendigkeit, Attribute auf Mitglieder oder Klassendefinitionen anzuwenden.

Ist das irgendwie irgendwo dokumentiert (habe ich nicht gefunden)? Denn ich war sehr erstickt, wie viel Vortex vermieden werden kann.

Antwort

2

Eigentlich müssen Sie nicht DataContract und DataMember Attribute verwenden, wenn Sie nicht möchten, aber sie geben Ihnen Flexibilität bei der Definition, was serialisiert werden muss und wie.

Ich schlage vor, beginnend mit Artikel Serializable Types on MSDN, es hat eine Menge Informationen wie Data Contract Serializer funktioniert. Hier sind zunächst zwei Absätze, was beweist, dass Sie keine Attribute benötigen verwenden:

standardmäßig die DataContractSerializer alle öffentlich sichtbar Typen serialisiert.

Alle öffentlichen Lese-/Schreibeigenschaften und Felder dieses Typs sind serialisiert. Sie können das Standardverhalten ändern, indem Sie die Attribute DataContractAttribute und DataMemberAttribute auf die Typen und members anwenden. Diese Funktion kann in Situationen nützlich sein, in denen Sie Typen haben, die nicht von Ihnen gesteuert werden und nicht zum Hinzufügen von -Attributen geändert werden können. Der DataContractSerializer erkennt solche "unmarkierten" Typen.

Die wichtigsten Regeln, die für Ihren Fall gelten, sind:

  • DataContract Attribut nicht vererbt wird. Sie können es entweder auf Ihre Basisklasse DTOBase anwenden oder es wird in der untergeordneten Klasse MyDTO ignoriert. Sie können DataContract Attribut aus DTOBase Klasse entfernen und das Ergebnis wird gleich sein. Wenn Sie das Attribut DataContract für eine Klasse verwenden, werden nur Mitglieder mit dem Attribut DataMember serialisiert. Dies ist, was in Ihrer ersten Probe in Klasse DataTransferObject passiert ist.
  • Wenn Sie das Attribut DataContract für eine Klasse nicht verwenden, werden alle öffentlichen Mitglieder einer Klasse serialisiert. Dies ist mit Ihrer Klasse MyDTO passiert.
Verwandte Themen