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. Tamsayılar ve dizeler gibi tüm .NET Framework ilkel türlerinin yanı sıra ve XmlElementgibi temel öğeler olarak DateTime kabul edilen bazı türler, başka bir hazırlık olmadan seri hale getirilebilir ve varsayılan veri sözleşmelerine sahip olduğu 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. kullanarak IgnoreDataMemberAttributeüyeleri serileştirmeden geri çevirebilirsiniz. Ve özniteliklerini kullanarak DataContractAttributeDataMemberAttribute açıkça bir veri sözleşmesi de oluşturabilirsiniz. Bu normalde özniteliği türüne DataContractAttribute uygulanarak 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 bkz . SeriLeştirilebilir Türler.

Örnek

Aşağıdaki örnekte ve OperationContractAttribute özniteliklerinin açıkça uygulandığı bir hizmet sözleşmesi (arabirim) ServiceContractAttribute gösterilmektedir. Ö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, ve öznitelikleri sınıfına ve üyelerine MyTypes.PurchaseOrder uygulanarak DataContractAttributeDataMemberAttribute 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, , , CollectionDataContractAttributeSerializableAttributeveya özniteliklerinden DataContractAttributebiriyle işaretlenmemiş veya EnumMemberAttribute başka bir yolla (örneğinIXmlSerializable) serileştirilebilir olarak işaretlenmemiş türleri içerir.

  • Özniteliği alanlara DataMemberAttribute ve özelliklere 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, türü üzerinde herhangi bir oluşturucu çağrılmadan ilk olarak başlatılmamış bir nesne oluşturulur. Ardından tüm veri üyeleri seri durumdan çıkarılır.

  • Seri durumdan çıkarma sırasında özellik kümesi kodu, özellikleri seri durumdan çıkarılmakta olan değere ayarlamak üzere özellik veri üyeleri için ç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 olmadığı 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 bkz.