.3.1 数据协定和数据成员的等效性
要使数据协定等效,其命名空间和名称必须相同,在某一端上的每个数据成员还必须在另一端上有等效的数据成员。
要使数据成员等效,其名称必须相同,同时还必须表示同一类型的数据,即数据协定也必须等效。
如果发送或接受方存在两种类型,而其数据协定又不等效,则不应为其指定相同的名称和命名空间,否则会引发异常。
示例如下:
以下这两个数据协定是等效的
[DataContract]
Pulic 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;
}
6.3.2 数据成员顺序的等效性
使用DataMemberAttribute类的Order属性可以影响数据协定的等效性,其成员必须以相同顺序出现,这样数据协定才会等效,默认按字母顺序。
示例:
[DataMember(Name="LASTNAME",Order=1)]
public string LastName { get; set; }
数据排序的基本规则:
如果数据协定类型为继承层次之一,则基类类型数据成员始终排在第一位
排在下一位的为当前数据类型的数据成员,默认按字母顺序排序,
再下边为设置了DataMemberAttribute属性的Order属性的数据成员,按order值升序排列,如果遇到多个成员有相同order值则对这些成员按字母排列。
示例如下:
[DataContract]
Public class BaseType
{
[DataMember]
Public string zebra;
}
[DataContract]
Public class DervicedType:BaseType
{
[DataMeber(Order=0)]
Public string bird;
[DataMember(Order=1)]
Public string parrot;
[DataMember]
Public string dog;
[DataMember(Order=3)]
Public string antelope;
[DataMember]
Public string cat;
[DataMember(Order=1)]
Public string albatross;
}
以上该协定产生的数据的顺序如下:
<DerivedType>
<zebra/>//首先是继承基类的数据成员
<cat/>//其次派生类中没有用order标注的数据成员,按照成员名的字母排序列车,c在的之前所以先是cat,然后是dog
<dog/>
<bird/>然后按照order属性的有小到大排列
<albatross/>//如果order值相等则按照数据名称排序
<parrot/>
<antelope/>
</DerivedType>