Veri Sözleşmesi Eşitliği

İstemcinin belirli bir türdeki verileri bir hizmete veya bir hizmete başarıyla veri göndermesi için gönderilen türün alıcı uçta bulunması gerekmez. Tek gereksinim, her iki türdeki veri sözleşmelerinin eşdeğer olmasıdır. (Bazen, katı denklik gerekli değildir, açıklandığı gibiVeri Sözleşmesi Sürüm Oluşturma.)

Veri sözleşmelerinin eşdeğer olması için aynı ad alanına ve ada sahip olmaları gerekir. Ayrıca, bir taraftaki her veri üyesinin diğer tarafında eşdeğer bir veri üyesi olmalıdır.

Veri üyelerinin eşdeğer olması için aynı ada sahip olmaları gerekir. Ayrıca, aynı veri türünü temsil etmelidir; yani veri sözleşmelerinin eşdeğer olması gerekir.

Not

Veri sözleşmesi adlarının ve ad alanlarının yanı sıra veri üyesi adlarının büyük/küçük harfe duyarlı olduğunu unutmayın.

Veri sözleşmesi adları ve ad alanlarının yanı sıra veri üyesi adları hakkında daha fazla bilgi için bkz . Veri Sözleşmesi Adları.

Aynı tarafta iki tür varsa (gönderen veya alıcı) ve veri sözleşmeleri eşdeğer değilse (örneğin, farklı veri üyeleri varsa), onlara aynı adı ve ad alanını vermemelisiniz. Bunu yapmak özel durumların atılması neden olabilir.

Aşağıdaki türler için veri sözleşmeleri eşdeğerdir:

[DataContract]
public class Customer
{
    [DataMember]
    public string fullName;

    [DataMember]
    public string telephoneNumber;
}

[DataContract(Name = "Customer")]
public class Person
{
    [DataMember(Name = "fullName")]
    private string nameOfPerson;

    private string address;

    [DataMember(Name = "telephoneNumber")]
    private string phoneNumber;
}
<DataContract()> _
Public Class Customer

    <DataMember()> _
    Public fullName As String

    <DataMember()> _
    Public telephoneNumber As String
End Class

<DataContract(Name:="Customer")> _
Public Class Person

    <DataMember(Name:="fullName")> _
    Private nameOfPerson As String

    Private address As String

    <DataMember(Name:="telephoneNumber")> _
    Private phoneNumber As String
End Class

Veri Üyesi Sırası ve Veri Sözleşmesi eşdeğerliği

Order sınıfının özelliğinin DataMemberAttribute kullanılması veri sözleşmesi denkliğini etkileyebilir. Veri sözleşmelerinin eşdeğer olması için aynı sırada görünen üyeleri olmalıdır. Varsayılan sıra alfabetiktir. Daha fazla bilgi için bkz . Veri Üyesi Sırası.

Örneğin, aşağıdaki kod eşdeğer veri sözleşmelerine neden olur.

[DataContract(Name = "Coordinates")]
public class Coords1
{
    [DataMember]
    public int X;
    [DataMember]
    public int Y;
    // Order is alphabetical (X,Y).
}

[DataContract(Name = "Coordinates")]
public class Coords2
{
    [DataMember]
    public int Y;
    [DataMember]
    public int X;
    // Order is alphabetical (X,Y), equivalent
    // to the preceding code.
}

[DataContract(Name = "Coordinates")]
public class Coords3
{
    [DataMember(Order = 2)]
    public int Y;
    [DataMember(Order = 1)]
    public int X;
    // Order is according to the Order property (X,Y),
    // equivalent to the preceding code.
}
<DataContract(Name:="Coordinates")> _
Public Class Coords1
    <DataMember()> _
    Public X As Integer
    <DataMember()> _
    Public Y As Integer
    ' Order is alphabetical (X,Y).
End Class

<DataContract(Name:="Coordinates")> _
Public Class Coords2

    <DataMember()> _
    Public Y As Integer
    <DataMember()> _
    Public X As Integer
    ' Order is alphabetical (X,Y), equivalent 
    ' to the preceding code.
End Class

<DataContract(Name:="Coordinates")> _
Public Class Coords3
    <DataMember(Order:=2)> _
    Public Y As Integer
    <DataMember(Order:=1)> _
    Public X As Integer
    ' Order is according to the Order property (X,Y), 
    ' equivalent to the preceding code.
End Class

Ancak, aşağıdakiler eşdeğer bir veri sözleşmesine neden olmaz.

[DataContract(Name = "Coordinates")]
public class Coords4
{
    [DataMember(Order = 1)]
    public int Y;
    [DataMember(Order = 2)]
    public int X;
    // Order is according to the Order property (Y,X),
    // different from the preceding code.
}
<DataContract(Name:="Coordinates")> _
Public Class Coords4

    <DataMember(Order:=1)> _
    Public Y As Integer
    <DataMember(Order:=2)> _
    Public X As Integer
    ' Order is according to the Order property (Y,X), 
    ' different from the preceding code.
End Class

Devralma, Arabirimler ve Veri Sözleşmesi Denkliği

Denklik belirlenirken, başka bir veri sözleşmesinden devralan bir veri sözleşmesi, temel türdeki tüm veri üyelerini içeren tek bir veri sözleşmesi gibi değerlendirilir. Veri üyelerinin sırasının eşleşmesi gerektiğini ve bu temel tür üyelerinin türetilmiş tür üyelerinden önce sıralı olduğunu unutmayın. Ayrıca, aşağıdaki kod örneğinde olduğu gibi, iki veri üyesi aynı sipariş değerine sahipse, bu veri üyeleri için sıralama alfabetiktir. Daha fazla bilgi için bkz . Veri Üyesi Sırası.

Aşağıdaki örnekte, türü için veri sözleşmesi türü Employee için veri sözleşmesine Workereşdeğerdir.

[DataContract]
public class Person
{
    [DataMember]
    public string name;
}
[DataContract]
public class Employee : Person
{
    [DataMember]
    public int department;
    [DataMember]
    public string title;
    [DataMember]
    public int salary;
}
// Order is "name", "department", "salary", "title"
// (base class first, then alphabetical).

[DataContract(Name = "Employee")]
public class Worker
{
    [DataMember(Order = 1)]
    public string name;
    [DataMember(Order = 2)]
    public int department;
    [DataMember(Order = 2)]
    public string title;
    [DataMember(Order = 2)]
    public int salary;
}
// Order is "name", "department", "salary", "title"
// (Order=1 first, then Order=2 in alphabetical order),
// which is equivalent to the Employee order}.
<DataContract()> _
Public Class Person
    <DataMember()> Public name As String
End Class

<DataContract()> _
Public Class Employee
    Inherits Person
    <DataMember()> Public department As Integer
    <DataMember()> Public title As String
    <DataMember()> Public salary As Integer
End class

' Order is "name", "department", "salary", "title" 
' (base class first, then alphabetical).

<DataContract(Name:="Employee")> _
Public Class Worker

    <DataMember(Order:=1)> _
    Public name As String
    <DataMember(Order:=2)> _
    Public department As Integer
    <DataMember(Order:=2)> _
    Public title As String
    <DataMember(Order:=2)> _
    Public salary As Integer
End Class
' Order is "name", "department", "salary", "title" 
' (Order=1 first, then Order=2 in alphabetical order), 
' which is equivalent to the Employee order}.

İstemci ve hizmet arasında parametre ve dönüş değerleri geçirilirken, alıcı uç nokta türetilmiş bir sınıftan veri sözleşmesi beklediğinde temel sınıftan veri sözleşmesi gönderilemez. Bu, nesne odaklı programlama kümelerine göredir. Önceki örnekte, türünde bir nesne Person beklendiğinde Employee gönderilemez.

Bir temel sınıftan veri sözleşmesi beklendiğinde, ancak yalnızca alıcı uç nokta kullanılarak KnownTypeAttributetüretilmiş türü "biliyor" olduğunda türetilmiş bir sınıftan veri sözleşmesi gönderilebilir. Daha fazla bilgi için bkz . Veri Sözleşmesi Bilinen Türleri. Önceki örnekte, türündeki Employee bir nesnesi beklendiğinde Person gönderilebilir, ancak yalnızca alıcı kodu bilinen türler listesine eklemek için öğesini KnownTypeAttribute çalıştırıyorsa.

Parametreler geçirilirken ve uygulamalar arasında değer döndürülüyorsa, beklenen tür bir arabirimse, türündeki Objectbeklenen türe eşdeğerdir. Her tür sonunda türünden Objecttüretildiği için, her veri sözleşmesi sonunda için Objectveri sözleşmesinden türetilir. Bu nedenle, bir arabirim beklendiğinde herhangi bir veri sözleşmesi türü geçirilebilir. Arabirimlerle başarılı bir şekilde çalışmak için ek adımlar gereklidir; daha fazla bilgi için bkz . Veri Sözleşmesi Bilinen Türleri.

Ayrıca bkz.