Ich bin sehr verwirrt über das DataContract
Attribut 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 DataContract
und DataMember
es 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);
}
Antworten:
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:
[DataContract]
können Sie keinen XML-Namespace definieren, in dem Ihre Daten leben sollen[DataMember]
können Sie nicht öffentliche Eigenschaften oder Felder nicht serialisieren[DataMember]
können Sie keine Reihenfolge der Serialisierung (Order=
) definieren, und das DCS serialisiert alle Eigenschaften alphabetisch[DataMember]
können Sie keinen anderen Namen für Ihre Eigenschaft definieren (Name=
)[DataMember]
können Sie keine Dinge wieIsRequired=
oder andere nützliche Attribute definieren[DataMember]
können Sie bestimmte öffentliche Eigenschaften nicht auslassen - alle öffentlichen Eigenschaften werden vom DCS serialisiertFü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 ...quelle
[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.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
datacontract
WCF verwenden, verwendetDataContractSerializer
WCFXmlSerializer
die Standard-Serialisierungstechnik.Lassen Sie mich im Detail erklären:
Grundsätzlich unterstützt WCF drei Arten der Serialisierung:
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 ...
quelle
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.
quelle
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
Wir müssen den System.Runtime.Serialization-Verweis auf das Projekt aufnehmen. Diese Assembly enthält die Attribute DataContract und DataMember.
quelle
Datenvertrag: Gibt an, dass Ihre Entitätsklasse für den Serialisierungsprozess bereit ist.
Datenelemente: Gibt an, dass das jeweilige Feld Teil des Datenvertrags ist und serialisiert werden kann.
quelle
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
quelle
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.
quelle