Aracılığıyla paylaş


Veri Sözleşmelerini Kullanma

Veri sözleşmesi, bir hizmet ile istemci arasında değiş tokuş edilecek verileri soyut olarak açıklayan resmi bir anlaşmadır. Başka bir ifadeyle, iletişim kurmak için istemcinin ve hizmetin aynı türleri, yalnızca aynı veri sözleşmelerini paylaşması gerekmez. Veri sözleşmesi, her parametre veya dönüş türü için hangi verilerin seri hale getirileceğini (XML'ye dönüştürüldü) kesin olarak tanımlar.

Veri SözleşmesiNin Temelleri

Windows Communication Foundation (WCF), verileri seri hale getirmek ve seri durumdan çıkarmak (XML'ye ve XML'den dönüştürmek) için varsayılan olarak Veri Sözleşmesi Seri Hale Getiricisi adlı bir serileştirme altyapısı kullanır. .NET Framework’nin tamsayılar ve dizeler gibi tüm ilkel türleri ve bazı türler, örneğin DateTime ve XmlElement, temel öğeler olarak kabul edilir, başka bir hazırlık olmadan seri hale getirilmesi ve varsayılan veri sözleşmelerine sahip oldukları kabul edilir. Birçok .NET Framework türünün de var olan veri anlaşmaları vardır. Serileştirilebilir türlerin tam listesi için bkz. Veri Sözleşmesi Seri Hale Getiricisi Tarafından Desteklenen Türler.

Oluşturduğunuz yeni karmaşık türlerin serileştirilebilir olması için tanımlanmış bir veri sözleşmesi olmalıdır. Varsayılan olarak, DataContractSerializer veri sözleşmesini çıkarsar ve genel olarak görünen tüm türleri serileştirir. Türdeki tüm genel okuma/yazma özellikleri ve alanları serileştirilir. Using IgnoreDataMemberAttribute ile üyeleri serileştirme işleminden hariç tutabilirsiniz. DataContractAttribute ve DataMemberAttribute özniteliklerini kullanarak açıkça bir veri sözleşmesi oluşturabilirsiniz. Bu normalde DataContractAttribute özelliği türe uygulayarak yapılır. Bu öznitelik sınıflara, yapılara ve numaralandırmalara uygulanabilir. Daha sonra özniteliğin DataMemberAttribute bir veri üyesi olduğunu, yani seri hale getirildiğini belirtmek için veri sözleşmesi türünün her üyesine uygulanması gerekir. Daha fazla bilgi için Serileştirilebilir Türler kısmına bakın.

Örnek

Aşağıdaki örnek, ServiceContractAttribute ve OperationContractAttribute özniteliklerinin açıkça uygulandığı bir hizmet sözleşmesini (bir arabirimi) göstermektedir. Örnek, ilkel türlerin veri sözleşmesi gerektirmediğini, karmaşık bir türün ise gerekli olduğunu gösterir.

[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

Aşağıdaki örnek, MyTypes.PurchaseOrder ve DataContractAttribute özniteliklerinin sınıfa ve üyelerine uygulanarak DataMemberAttribute türü için bir veri sözleşmesinin nasıl oluşturulduğunu gösterir.

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

Notlar

Aşağıdaki notlar, veri anlaşmaları oluştururken dikkate alınması gereken öğeler sağlar:

  • IgnoreDataMemberAttribute özniteliği yalnızca işaretsiz türlerle kullanıldığında kabul edilir. Bu, DataContractAttribute, SerializableAttribute, CollectionDataContractAttribute, veya EnumMemberAttribute özniteliklerinden biriyle işaretlenmemiş veya başka bir yolla (örneğin IXmlSerializable) serileştirilebilir olarak işaretlenmiş türleri içerir.

  • Alanlara ve özelliklere DataMemberAttribute özniteliğini uygulayabilirsiniz.

  • Üye erişilebilirlik düzeyleri (iç, özel, korumalı veya genel) veri sözleşmesini hiçbir şekilde etkilemez.

  • DataMemberAttribute Öznitelik statik üyelere uygulanırsa yoksayılır.

  • Serileştirme sırasında, özellik veri üyelerinin seri hale getirilecek özelliklerin değerini alması için özellik alma kodu çağrılır.

  • Seri durumdan çıkarma sırasında, herhangi bir tür oluşturucu çağrılmadan önce başlatılmamış bir nesne oluşturulur. Ardından tüm veri üyeleri seri durumdan çıkarılır.

  • Seri durumdan çıkarma sırasında, özelliklerin seri durumdan çıkarılmakta olan değere ayarlanabilmesi için özellik atanma kodu özellik veri üyeleri üzerinde çağrılır.

  • Bir veri sözleşmesinin geçerli olması için tüm veri üyelerini seri hale getirmek mümkün olmalıdır. Serileştirilebilir türlerin tam listesi için bkz. Veri Sözleşmesi Seri Hale Getiricisi Tarafından Desteklenen Türler.

    Genel türler, genel olmayan türler ile tam olarak aynı şekilde işlenir. Genel parametreler için özel gereksinimler yoktur. Örneğin, aşağıdaki türü göz önünde bulundurun.

[DataContract]
public class MyGenericType1<T>
{
    // Code not shown.
}
<DataContract()> _
Public Class MyGenericType1(Of T)
    ' Code not shown.
End Class

Genel tür parametresi (T) için kullanılan türün serileştirilebilir olup olmaması fark etmeksizin, bu tür serileştirilebilir. Tüm veri üyelerini seri hale getirmek mümkün olması gerektiğinden, aşağıdaki tür yalnızca aşağıdaki kodda gösterildiği gibi genel tür parametresi de serileştirilebilir olduğunda serileştirilebilir.

[DataContract]
public class MyGenericType2<T>
{
    [DataMember]
    T theData;
}
<DataContract()> _
Public Class MyGenericType2(Of T)
    <DataMember()> _
    Dim theData As T
End Class

Veri sözleşmesini tanımlayan bir WCF hizmetinin tam kod örneği için Temel Veri Sözleşmesi örneğine bakın.

Ayrıca bakınız