Megosztás a következőn keresztül:


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