Wann werden die Attribute DataContract und DataMember verwendet?

178

Ich bin sehr verwirrt über das DataContractAttribut in WCF. Meines Wissens wird es zum Serialisieren von benutzerdefinierten typähnlichen Klassen verwendet. Ich habe eine Klasse geschrieben, die auf Client-Seite so verfügbar ist.

[DataContract]
public class Contact
{
    [DataMember]
    public int Roll { get; set; }

    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public string Address { get; set; }

    [DataMember]
    public int Age { get; set; }
}

Es funktioniert richtig, aber wenn ich es entferne DataContractund DataMemberes funktioniert auch richtig. Ich kann nicht verstehen, warum es richtig funktioniert. Kann mir jemand sagen, wozu es eigentlich gut ist DataContract?

Mein Servicevertrag sieht so aus

[ServiceContract]    
public interface IRestServiceImpl
{
    [OperationContract]        
    Contact XmlData(string id);      
}
Sam
quelle
Eine perfekte Antwort ist hier stackoverflow.com/questions/5681842/…
Asif Iqbal

Antworten:

360

Da viele Programmierer mit dem überwältigt wurden [DataContract]und [DataMember]Attributen, mit .NET 3.5 SP1 hat Microsoft der Datenvertrag Serializer alle Klassen handhaben - auch ohne einem dieses Attribut - ähnlich wie der alte XML Serializer.

So wie von .NET 3.5 SP1, die Sie nicht haben , um Datenvertrag oder Datenelement hinzufügen Attribute mehr - wenn Sie nicht dann der Datenvertrag Serializer alle öffentlichen Eigenschaften auf Ihrer Klasse serialisiert wird , genau wie der XML - Serializer würde.

JEDOCH: Wenn Sie diese Attribute nicht hinzufügen, verlieren Sie viele nützliche Funktionen:

  • Ohne [DataContract]können Sie keinen XML-Namespace definieren, in dem Ihre Daten leben sollen
  • Ohne [DataMember]können Sie nicht öffentliche Eigenschaften oder Felder nicht serialisieren
  • Ohne [DataMember]können Sie keine Reihenfolge der Serialisierung ( Order=) definieren, und das DCS serialisiert alle Eigenschaften alphabetisch
  • ohne [DataMember]können Sie keinen anderen Namen für Ihre Eigenschaft definieren ( Name=)
  • Ohne [DataMember]können Sie keine Dinge wie IsRequired=oder andere nützliche Attribute definieren
  • Ohne [DataMember]können Sie bestimmte öffentliche Eigenschaften nicht auslassen - alle öffentlichen Eigenschaften werden vom DCS serialisiert

Für eine "quick'n'dirty" -Lösung funktioniert es also, die Attribute [DataContract]und wegzulassen [DataMember]- aber es ist immer noch eine gute Idee, sie in Ihren Datenklassen zu haben -, um genauer zu sagen, was Sie tun, und sich selbst zu geben Zugriff auf all die zusätzlichen Funktionen, die Sie ohne sie nicht erhalten ...

marc_s
quelle
Sie meinen, standardmäßig sind alle Datentypen intern als serialisierbar markiert, und wir haben DataContract / DataMember verwendet, um sie einzuschränken.
Santosh Singh
2
@Santosh: Wenn Sie eine Klasse mit einigen öffentlichen Eigenschaften haben, werden diese vom WCF Data Contract Serializer serialisiert, sofern Sie nicht explizit [DataContract] / [DataMember] anwenden. Dann liegt es zu 100% an Ihnen, zu sagen, was serialisiert wird und was nicht
marc_s
36
@ Arthur: das stimmt nicht ganz. Ab .NET 3.5 SP1, WCF wird glücklich serialize Klassen ohne jede [DataContract] und [DataMember]Attribute ... aber sobald Sie mit einem dieser Attribute beginnen, dann ist dieses „default“ Verhalten wird nicht mehr funktionieren - sobald Sie haben einzelne [DataMember] in Ihrem Klasse, ab diesem Zeitpunkt werden nur die Eigenschaften mit diesem Attribut serialisiert.
marc_s
4
Oohh! Danke für die Klarstellung dieses Punktes! Ich werde es dann etwas weiter graben!
Arthis
6
Youhou! es rockt!! Merci Beaucoup!
Arthis
15

In Bezug auf WCF können wir über Nachrichten mit dem Server und dem Client kommunizieren. Für die Übertragung von Nachrichten und aus Sicherheitsgründen müssen wir Daten / Nachrichten in einem serialisierten Format erstellen.

Für die Serialisierung von Daten verwenden wir die Attribute [datacontract] und [datamember]. In Ihrem Fall, wenn Sie datacontractWCF verwenden, verwendet DataContractSerializerWCF XmlSerializerdie Standard-Serialisierungstechnik.

Lassen Sie mich im Detail erklären:

Grundsätzlich unterstützt WCF drei Arten der Serialisierung:

  1. XmlSerializer
  2. DataContractSerializer
  3. NetDataContractSerializer

XmlSerializer : - Die Standardreihenfolge entspricht der Klasse

DataContractSerializer / NetDataContractSerializer : - Die Standardreihenfolge ist alphabetisch

XmlSerializer : - Das XML-Schema ist umfangreich

DataContractSerializer / NetDataContractSerializer : - Das XML-Schema ist eingeschränkt

XmlSerializer : - Versionsunterstützung nicht möglich

DataContractSerializer / NetDataContractSerializer : - Versionierungsunterstützung ist möglich

XmlSerializer : - Kompatibilität mit ASMX

DataContractSerializer / NetDataContractSerializer : - Kompatibilität mit .NET Remoting

XmlSerializer : - Attribut in XmlSerializer nicht erforderlich

DataContractSerializer / NetDataContractSerializer : - Für diese Serialisierung erforderliches Attribut

Was Sie verwenden, hängt also von Ihren Anforderungen ab ...

Pradeep atkari
quelle
8

Ein Datenvertrag ist eine formelle Vereinbarung zwischen einem Dienst und einem Kunden, in der die auszutauschenden Daten abstrakt beschrieben werden. Das heißt, um zu kommunizieren, müssen der Client und der Service nicht dieselben Typen, sondern nur dieselben Datenverträge gemeinsam nutzen. Ein Datenvertrag definiert für jeden Parameter oder Rückgabetyp genau, welche Daten serialisiert (in XML umgewandelt) werden, um ausgetauscht zu werden.

Windows Communication Foundation (WCF) verwendet standardmäßig eine Serialisierungs-Engine namens Data Contract Serializer, um Daten zu serialisieren und zu deserialisieren (in und aus XML konvertieren). Alle primitiven .NET Framework-Typen wie Ganzzahlen und Zeichenfolgen sowie bestimmte als Primitive behandelte Typen wie DateTime und XmlElement können ohne weitere Vorbereitung serialisiert werden und gelten als Standarddatenverträge. Viele .NET Framework-Typen verfügen auch über vorhandene Datenverträge.

Den vollständigen Artikel finden Sie hier.

mr.b.
quelle
2
Das ist alles wahr und in Ordnung, aber es beantwortet nicht wirklich die Frage des OP, warum der Datenvertrags-Serializer auch ohne die Attribute [DataContract] und [DataMember] für Ihre Klassen
funktioniert
Kann mir jemand sagen, wie DataContract tatsächlich verwendet wird? - Ich denke, zumindest ein Teil der Frage ist beantwortet.
Zusammenfassung
2

Ein Datenvertrag ist eine formelle Vereinbarung zwischen einem Dienst und einem Kunden, in der die auszutauschenden Daten abstrakt beschrieben werden.

Der Datenvertrag kann explizit oder implizit sein. Einfache Typen wie int, string usw. haben einen impliziten Datenvertrag. Benutzerdefinierte Objekte sind explizite oder komplexe Objekte, für die Sie einen Datenvertrag mit den Attributen [DataContract] und [DataMember] definieren müssen.

Ein Datenvertrag kann wie folgt definiert werden:

  • Es beschreibt das externe Format von Daten, die an und von Servicevorgängen übergeben werden

  • Es definiert die Struktur und Art der Daten, die in Dienstnachrichten ausgetauscht werden

  • Es ordnet einen CLR-Typ einem XML-Schema zu
  • Es definiert, wie Datentypen serialisiert und deserialisiert werden. Durch die Serialisierung konvertieren Sie ein Objekt in eine Folge von Bytes, die über ein Netzwerk übertragen werden können. Durch Deserialisierung setzen Sie ein Objekt aus einer Folge von Bytes wieder zusammen, die Sie von einer aufrufenden Anwendung erhalten.
  • Es ist ein Versionierungssystem, mit dem Sie Änderungen an strukturierten Daten verwalten können

Wir müssen den System.Runtime.Serialization-Verweis auf das Projekt aufnehmen. Diese Assembly enthält die Attribute DataContract und DataMember.

Kamran
quelle
2
  1. Datenvertrag: Gibt an, dass Ihre Entitätsklasse für den Serialisierungsprozess bereit ist.

  2. Datenelemente: Gibt an, dass das jeweilige Feld Teil des Datenvertrags ist und serialisiert werden kann.

Mrunalini
quelle
0

Auch wenn Sie von einer http-Anfrage aufrufen, funktioniert es ordnungsgemäß, aber wenn Sie versuchen, dieses Mal von net.tcp aus aufzurufen, erhalten Sie all diese Dinge

Pramod
quelle
0

Das DataMember-Attribut muss nicht hinzugefügt werden, um Daten zu serialisieren. Wenn das DataMember-Attribut nicht hinzugefügt wird, serialisiert der alte XMLSerializer die Daten. Das Hinzufügen eines DataMember bietet nützliche Eigenschaften wie Reihenfolge, Name und Anforderung, die nicht anderweitig verwendet werden können.

Vijay Mishra
quelle