在.NET中,所有的集合都实现了IEnumerable接口,比如Array、Hashtable、ArrayList、Stack、Queue 等。有的集合要求元素具有相同的类型,这种集合一般通过泛型的方式定义,它们实现另一个接口IEnumerable<T> (IEnumerable<T>本身继承自IEnumerable),这样的集合有List<T>、 Dictionary<TKey,TValue>、Stack<T>、Queue<T>等。基于集合类型的序列化具 有一些特殊的规则和行为,在上篇中我们详细介绍了基于泛型数据契约的序列化规则,接下来我们介绍基于集合对象的序列化,以及基于集合类型的服务操作。
一、IEnumerable<T>、Array与IList<T>
一 个集合对象能够被序列化的前提是集合中的每个元素都能被序列化,也就是要求元素的类型是一个数据契约(或者是应用了 SerialiableAttribute特性)。虽然集合具有各种各样的表现形式,由于其本质就是一组对象的组 合,DataContractSerializer在对它们进行序列化的时候,采用的序列化规则和序列化过程中表现出来的行为是相似的。比如我们现在需要 通过DataContractSerializer序列化一个Customer对象的集合,Customer类型定义如下。
namespace Artech.DataContractSerializerDemos
2: {
)]
class Customer
5: {
6: [DataMember(Order = 1)]
public Guid ID
8: { get; set; }
9:
10: [DataMember(Order=2)]
string Name
12: { get; set; }
13:
14: [DataMember(Order = 3)]
string Phone
16: { get; set; }
17:
18: [DataMember(Order = 4)]
string CompanyAddress
20: { get; set; }
21: }
22: }
现在我通过我们前面定义的范型Serialize<T>对以下3种不同类型的集合对象进行序列化:IEnumerable<Customer>、IList<Cusomter>和Customer[]。
new Customer
2: {
3: ID = Guid.NewGuid(),
,
,
7: };
8:
new Customer
10: {
11: ID = Guid.NewGuid(),
,
,
15: };
new Customer[] { customerFoo, customerBar };
17: IEnumerable<Customer> customerCollection = customerArray;
18: IList<Customer> customerList = customerArray.ToList<Customer>();
19:
);
);