6、等效数据契约。
当数据契约在客户端和服务端不一致的时候,比如,服务端数据契约的添加或者删除数据成员的时候,如何处理呢。
1)、数据契约的等效性:
等效的数据契约,就是指两个数据契约在进行序列化之后,生成的XML文件一样的时候就是等效的数据契约,这个可以通过DataContract和DataMemeber的Name属性指定相同的数据契约,如:
[DataContract]
public class Customer
{
[DataMember]
public string FirstName{get;set;}
}
[DataContract(Name ="Customer")]
public class Contact
{
[DataMemeber(Name ="FirstName")]
public class Surname{get;set;}
}
上面两个数据契约就是等效的,在客户端调用会等到一样的数据契约。
2)、数据成员的添加:
当服务端对数据契约中添加了一个数据成员的时候,这时候,在客户端,调用并不会报出异常,只不过,在客户端对于的数据契约的这个成员,返回的值为Null,在DataMember特性里,有一个IsRequired属性,默认情况下这个属性是false,表示这个数据成员在序列化的时候可以缺少,但是如果设置了IsRequired为true的时候,客户端和服务端数据契约必须包含这个数据成员,否则会报错。
public class Contact
{
[DataMemeber(Name ="FirstName" IsRequired = true)]//说明序列化的时候,客户端和服务端必须包含该属性
public class Surname{get;set;}
}
3)、数据成员的删除:
这里说的是服务端的数据契约删除一个成员的时候,也是说服务端的数据契约比客户端少一个数据成员,应该如何处理呢
默认情况下,当服务端缺少数据成员的时候,在客户端,进行反序列化得到对应的数据契约对象的时候,并不会抛出异常,只不过,客户端得到的数据契约对象对应的缺少的数据成员值是null。
7、序列化在WCF框架中的实现。
1)、消息格式化器:
消息格式化器是对消息的序列化和反序列化的组件,在服务端和客户端名称不同,在服务端被称为分发消息格式化器,在客户端叫客户端消息格式化器。
WCF中,定义了两个特性,DataContractFormateAttribute和XmlSerializeFormateAttribute,在相应的契约或类上应用那个特性,WCF就按照那种序列化方式进行序列化和反反序列化,如果一个类生同时应用了这两个特性,则按照XmlSerializerFormate方式序列化,如果都不加,默认是采用DataContractFormate方式进行序列化和反序列化的。
浙公网安备 33010602011771号