Adatszerződések használata
Az adatszerződés egy szolgáltatás és egy ügyfél közötti formális szerződés, amely absztrakt módon írja le a kicserélendő adatokat. Vagyis a kommunikációhoz az ügyfélnek és a szolgáltatásnak nem kell ugyanazokat a típusokat megosztania, csak ugyanazokat az adatszerződéseket. Az adatszerződés pontosan meghatározza, hogy az egyes paraméterek vagy visszatérési típusok milyen adatokat szerializálnak (XML-vé alakítva).
Az adatszerződés alapjai
A Windows Communication Foundation (WCF) alapértelmezés szerint az adatszerződés szerializálójának nevezett szerializálási motort használja az adatok szerializálására és deszerializálására (konvertálás xml-fájlba és XML-fájlból). Minden .NET-keretrendszer primitív típus, például egész számok és sztringek, valamint a primitívként kezelt bizonyos típusok, például DateTime és XmlElement, más előkészítés nélkül szerializálhatók, és alapértelmezett adatszerződésekként tekinthetők. Számos .NET-keretrendszer típus rendelkezik meglévő adatszerződéssel is. A szerializálható típusok teljes listáját az Adatszerződés szerializálója által támogatott típusok című témakörben találja.
A létrehozott új összetett típusoknak rendelkezniük kell egy adatszerződéssel ahhoz, hogy szerializálhatóak legyenek. Alapértelmezés szerint a rendszer az DataContractSerializer adatszerződésre következtet, és szerializálja az összes nyilvánosan látható típust. Az összes nyilvános olvasási/írási tulajdonság és mező szerializálva van. A tagok a szerializálástól a következő használatával IgnoreDataMemberAttributetilthatók le: . Kifejezetten létrehozhat adatszerződést is az attribútumok és DataMemberAttribute az attribútumok használatávalDataContractAttribute. Ez általában úgy történik, hogy az attribútumot a DataContractAttribute típusra alkalmazza. Ez az attribútum osztályokra, struktúrákra és számbavételekre alkalmazható. Az DataMemberAttribute attribútumot ezután az adatszerződés-típus minden egyes tagjára alkalmazni kell, hogy jelezze, hogy adattag, azaz szerializálni kell. További információ: Szerializálható típusok.
Példa
Az alábbi példa egy szolgáltatási szerződést (interfészt) mutat be, amelyre az és OperationContractAttribute az ServiceContractAttribute attribútumok explicit módon lettek alkalmazva. A példa azt mutatja, hogy a primitív típusok nem igényelnek adatszerződést, míg egy összetett típus igen.
[ServiceContract]
public interface ISampleInterface
{
// No data contract is required since both the parameter
// and return types are primitive types.
[OperationContract]
double SquareRoot(int root);
// No Data Contract required because both parameter and return
// types are marked with the SerializableAttribute attribute.
[OperationContract]
System.Drawing.Bitmap GetPicture(System.Uri pictureUri);
// The MyTypes.PurchaseOrder is a complex type, and thus
// requires a data contract.
[OperationContract]
bool ApprovePurchaseOrder(MyTypes.PurchaseOrder po);
}
<ServiceContract()> _
Public Interface ISampleInterface
' No data contract is required since both the parameter and return
' types are both primitive types.
<OperationContract()> _
Function SquareRoot(ByVal root As Integer) As Double
' No Data Contract required because both parameter and return
' types are marked with the SerializableAttribute attribute.
<OperationContract()> _
Function GetPicture(ByVal pictureUri As System.Uri) As System.Drawing.Bitmap
' The MyTypes.PurchaseOrder is a complex type, and thus
' requires a data contract.
<OperationContract()> _
Function ApprovePurchaseOrder(ByVal po As MyTypes.PurchaseOrder) As Boolean
End Interface
Az alábbi példa bemutatja, hogyan jön létre adatszerződés a MyTypes.PurchaseOrder
típushoz az DataContractAttribute osztályra és DataMemberAttribute annak tagjaira alkalmazott attribútumokkal.
namespace MyTypes
{
[DataContract]
public class PurchaseOrder
{
private int poId_value;
// Apply the DataMemberAttribute to the property.
[DataMember]
public int PurchaseOrderId
{
get { return poId_value; }
set { poId_value = value; }
}
}
}
Namespace MyTypes
<System.Runtime.Serialization.DataContractAttribute()> _
Public Class PurchaseOrder
Private poId_value As Integer
' Apply the DataMemberAttribute to the property.
<DataMember()> _
Public Property PurchaseOrderId() As Integer
Get
Return poId_value
End Get
Set
poId_value = value
End Set
End Property
End Class
End Namespace
Jegyzetek
Az alábbi megjegyzések az adatszerződések létrehozásakor megfontolandó elemeket tartalmazzák:
Az IgnoreDataMemberAttribute attribútum csak akkor érvényes, ha jelöletlen típusok esetén használják. Ide tartoznak azok a típusok, amelyek nincsenek megjelölve az DataContractAttributeegyik , SerializableAttribute, , CollectionDataContractAttributevagy EnumMemberAttribute attribútummal, vagy más módon szerializálhatóként vannak megjelölve (például IXmlSerializable).
Az attribútumot DataMemberAttribute mezőkre és tulajdonságokra is alkalmazhatja.
A tagok akadálymentességi szintjei (belső, privát, védett vagy nyilvános) semmilyen módon nem befolyásolják az adatszerződést.
Az DataMemberAttribute attribútum figyelmen kívül lesz hagyva, ha statikus tagokra van alkalmazva.
A szerializálás során a tulajdonság-lekéréses kód meghívja a tulajdonságadat-tagokat a szerializálandó tulajdonságok értékének lekéréséhez.
A deszerializálás során először létrejön egy nem inicializált objektum anélkül, hogy konstruktorokat hívna meg a típuson. Ezután az összes adattag deszerializálva lesz.
A deszerializálás során a tulajdonságkészlet-kód meghívja a tulajdonságadat-tagokat, hogy a tulajdonságokat a deszerializált értékre állítsa.
Ahhoz, hogy egy adatszerződés érvényes legyen, lehetővé kell tenni az összes adattag szerializálását. A szerializálható típusok teljes listáját az Adatszerződés szerializálója által támogatott típusok című témakörben találja.
Az általános típusok kezelése pontosan ugyanúgy történik, mint a nem általános típusok. Az általános paraméterekre nincsenek különleges követelmények. Vegyük például a következő típust.
[DataContract]
public class MyGenericType1<T>
{
// Code not shown.
}
<DataContract()> _
Public Class MyGenericType1(Of T)
' Code not shown.
End Class
Ez a típus szerializálható, függetlenül attól, hogy az általános típusparaméterhez (T
) használt típus szerializálható-e. Mivel az összes adattagot szerializálni kell, a következő típus csak akkor szerializálható, ha az általános típusparaméter is szerializálható, ahogyan az az alábbi kódban is látható.
[DataContract]
public class MyGenericType2<T>
{
[DataMember]
T theData;
}
<DataContract()> _
Public Class MyGenericType2(Of T)
<DataMember()> _
Dim theData As T
End Class
Az adatszerződést meghatározó WCF-szolgáltatás teljes kódmintájáért tekintse meg az Alapszintű adatszerződés mintát.
Lásd még
- DataMemberAttribute
- DataContractAttribute
- Szerializálható típusok
- Adatszerződések nevei
- Adatszerződés egyenértékűsége
- Adattagsorrend
- Adatszerződés ismert típusai
- Továbbítással kompatibilis adatszerződések
- Adatszerződés verziószámozása
- Verziótűrő szerializálási visszahívások
- Az adattag alapértelmezett értékei
- Az adatszerződés szerializálója által támogatott típusok
- Útmutató: Alapszintű adatszerződés létrehozása osztályhoz vagy struktúrához