5、泛型数据契约与集合数据契约。
1)、泛型数据契约:
泛型数据契约,经过序列化之后,生成的xml文件的根节点的命名规则是:“{类型名称}Of{泛型数据契约名称1}{泛型数据契约名称2}...{含命名空间的泛型类型哈希值}”,如泛型类型数据契约:Bill<OrderBillHeader,OrderBillDetails>,序列化之后,得到的xml根节点就是<BillOfOrderBillHeaderOrderBillDetail{哈希值...}>。
2)、数据契约集合:
IEnumberable<T>、Array、IList<T>这三种类型,经过序列化之后生成的Xml是一样的,也就是说,这三种类型的数据,经过序列化和反序列化之后,得到的类型都是其对应元素的数组,举个例子:
服务端:
[ServiceContract]
public interface ICustomerManager
{
[OperationContract]
void AddCustomerArray (Customer[] customers);
[OperationContract]
void AddCustomerArray (IEnumberable<Customer> customers);
[OperationContract]
void AddCustomerArray (IList<Customer> customers);
}
序列化之后,在客户端在反序列化得到的代码是:
[ServiceContract]
public interface ICustomerManager
{
[OperationContract]
void AddCustomerArray (Customer[] customers);
[OperationContract]
void AddCustomerArray (Customer[] customers);
[OperationContract]
void AddCustomerArray (Customer[] customers);
}
客户端生成的代码集合默认都是数组类型,不过在这个数组类型是可以定制的,就是在添加服务引用的时候,在客户端高级选项中,可以选择生成的集合类型。
而对于上面的集合,其集合元素的类型是已知的,但是,对于IEnumberable和IList这两个类型,其元素是未知的,这样在客户端生成的代码,都会变成Object[]类型。
3)、集合数据契约:
上面介绍的数据契约集合,即集合的元素都是数据契约对象,而现在讲的是集合数据契约,即把一个集合当做数据契约处理,举个例子:
pulic class CustomerCollection:IEnumberable<Customer>
{
public IList<Customer> Customers{get;private set;}
public CustomerCollection(paras customer[] customers)
{
if(null == customers)
{
this.Customers = new List<Customer>();
}
else
{
this.Customers =customers;
}
}
public CustomerCollection(){}
public void Add(Customer customer)
{
this.Customers.Add(customer);
}
public IEnumberable<Customer> GetEnumberator()
{
return this.Customers.GetEnumberator();
}
IEnumberable GetEnumberator()
{
return this.Customers.GetEnumberator();
}
}
对上面的集合进行序列化之后,生成的xml文件盒IEnumberable<Customer>集合类型等生成的xml一样的,在WCF中,有一种叫做集合数据契约的,就是在相应的集合类型上添加CollectionDataContract特性,这个特性可以通过Name属性指定生成的xml根节点的名称,通过ItemName属性指定集合元素的 类型名称。
注意:在集合数据契约中的定义的集合类型,其中一个空的构造函数,和Add方法,这两个是必须要的,否则都会报错。
4)、字典数据契约:
对于字典类型的数据契约,本身字典类型就是一种特性的集合类型,在C#中有两个字典类型一个是Hashtable,一个是IDictionary<key,value>,在服务端这两种类型,经过序列化之后,在客户端经过反序列化,最终得到都是IDictionary<key,value>类型,同样客户端得到的类型,也是可以通过在客户端添加引用的高级选项中也可以修改。
浙公网安备 33010602011771号