Delen via


Gelijkwaardigheid van gegevenscontract

Voor een client om gegevens van een bepaald type naar een service te verzenden, of een service om gegevens naar een client te verzenden, hoeft het verzonden type niet noodzakelijkerwijs te bestaan aan het ontvangende einde. De enige vereiste is dat de gegevenscontracten van beide typen gelijkwaardig zijn. (Soms is strikte gelijkwaardigheid niet vereist, zoals besproken in Versiebeheer van gegevenscontract.)

Voor gegevenscontracten moeten ze dezelfde naamruimte en naam hebben. Daarnaast moet elk gegevenslid aan de ene kant een gelijkwaardig gegevenslid aan de andere kant hebben.

Als gegevensleden gelijkwaardig zijn, moeten ze dezelfde naam hebben. Daarnaast moeten ze hetzelfde type gegevens vertegenwoordigen; dat wil gezegd dat hun gegevenscontracten gelijkwaardig moeten zijn.

Notitie

Houd er rekening mee dat namen van gegevenscontracts en naamruimten, evenals namen van gegevensleden, hoofdlettergevoelig zijn.

Zie Namen van gegevenscontract voor meer informatie over namen en naamruimten van gegevenscontracten, evenals namen van gegevenslidnamen.

Als er twee typen bestaan aan dezelfde kant (afzender of ontvanger) en hun gegevenscontracten niet gelijkwaardig zijn (ze hebben bijvoorbeeld verschillende gegevensleden), moet u ze niet dezelfde naam en naamruimte geven. Als u dit doet, kunnen uitzonderingen worden gegenereerd.

De gegevenscontracten voor de volgende typen zijn gelijkwaardig:

[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

Gelijkwaardigheid van gegevenslidvolgorde en gegevenscontract

Het gebruik van de Order eigenschap van de DataMemberAttribute klasse kan van invloed zijn op de gelijkwaardigheid van het gegevenscontract. De gegevenscontracten moeten leden hebben die in dezelfde volgorde als gelijkwaardig worden weergegeven. De standaardvolgorde is alfabetisch. Zie Order voor gegevenslid voor meer informatie.

De volgende code resulteert bijvoorbeeld in gelijkwaardige gegevenscontracten.

[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

Het volgende resulteert echter niet in een gelijkwaardig gegevenscontract.

[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

Overname, interfaces en gelijkwaardigheid van gegevenscontract

Bij het bepalen van gelijkwaardigheid wordt een gegevenscontract dat overneemt van een ander gegevenscontract behandeld alsof het slechts één gegevenscontract is dat alle gegevensleden van het basistype bevat. Houd er rekening mee dat de volgorde van de gegevensleden moet overeenkomen en dat leden van het basistype voorafgaan aan afgeleide typeleden in de volgorde. Als, net als in het volgende codevoorbeeld, twee gegevensleden dezelfde orderwaarde hebben, is de volgorde voor die gegevensleden alfabetisch. Zie Order voor gegevenslid voor meer informatie.

In het volgende voorbeeld is het gegevenscontract voor het type Employee gelijk aan het gegevenscontract voor het type Worker.

[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}.

Wanneer u parameters doorgeeft en waarden retourneert tussen een client en een service, kan een gegevenscontract van een basisklasse niet worden verzonden wanneer het ontvangende eindpunt een gegevenscontract van een afgeleide klasse verwacht. Dit is in overeenstemming met objectgeoriënteerde programmeertets. In het vorige voorbeeld kan een object van het type Person niet worden verzonden wanneer een Employee object wordt verwacht.

Een gegevenscontract van een afgeleide klasse kan worden verzonden wanneer een gegevenscontract van een basisklasse wordt verwacht, maar alleen als het ontvangende eindpunt weet van het afgeleide type met behulp van de KnownTypeAttribute. Zie Bekende typen gegevenscontracten voor meer informatie. In het vorige voorbeeld kan een object van het type Employee worden verzonden wanneer een Person wordt verwacht, maar alleen als de ontvangercode de KnownTypeAttribute code gebruikt om het op te nemen in de lijst met bekende typen.

Wanneer u parameters doorgeeft en waarden retourneert tussen toepassingen, als het verwachte type een interface is, is dit gelijk aan het verwachte type van het type Object. Omdat elk type uiteindelijk is afgeleid van Object, is elk gegevenscontract uiteindelijk afgeleid van het gegevenscontract voor Object. Elk gegevenscontracttype kan dus worden doorgegeven wanneer een interface wordt verwacht. Er zijn extra stappen vereist om met interfaces te kunnen werken; Zie Bekende typen gegevenscontracten voor meer informatie.

Zie ook