刚参加完上司的婚礼,感觉很不错,,婚礼现场像童话一般,,不知道是不是很多女生都憧憬着这样的一天    WCF笔记--泛型与集合数据类型_童话

还是记录一下,学习所得


数据契约

  首先是数据契约,可能包括有[DataContract] [DataMember] ,甚至各样的操作,

  其次就是已知类型,[ServiceKnownType] [KnownType] 比较简单不是这篇的重点


泛型数据类型

   然后就是

   在.NET Framework 2.0中,泛型第一次被引入。我们可以定义泛型接口、泛型类型、泛型委托和泛型方法。序列化依赖于真实具体的类型,而泛型则刻意模糊了具体类型概念。而集合代表一组对象的组合,集合具有可迭代(Enumerable)的特性,可以通过某个迭代规则遍历集合中的每一个元素。范型类型和集合类型在序列化和反序列化上具有一些特殊的行为和规则,我们继续下去


  1. 首先定义泛型中需要的数据契约

[DataContract]
public class Student
{
    [DataMember]
    public string Name {get; set;}
}   //... 可能还有其他类型

  2. 定义泛型类型

[DataContract]
public class School<Student>
{
     [DataMember]
     public Student stu {get; set;}
}

  3. 实例化这个泛型对象

  略...

  4. 序列化泛型对象

  Serialize<School<Student>>(实例化后的泛型对象, @"school.xml");

  之后我们会发现 SchoolOfStudentjOfvLqKh 开头的XML节点,让人匪夷所思,仔细发现

  会发现它的组成结构是这样的:{类型名称(School)}+ Of + {范型参数的类型(Student)} }+ {哈希值(jOfvLqKh)}

  就算我们修改数据契约的名称会发现哈希散列值依旧没有任何变化,其实这是ms为了防止命名冲突而为,

  切记不要在2步骤将name设死,不过我们可以这样做 DataContract(Name="SchoolOf{0}{#}")]

  这样元数据发布时我们就可以使用到属于自己定义的泛型类型了..


集合数据类型

在.NET中,所有的集合都实现了IEnumerable接口,比如Array、Hashtable、ArrayList

定义与服务端使用就略过了,,

关键要记住 DataContractSerializer对于IEnumerable<T>、Array与IList<T>序列化的结果XML是完全一致的,根节点的名称以ArrayOf为前缀,后面紧跟集合元素类型对应的数据契约名称,那么我们的客户端在使用时都是Student[],这可怎么办?

这个时候千万不要忘记了我们身边的"神器"IDE了

WCF笔记--泛型与集合数据类型_婚礼现场_02

这样我们就可以在客户端舒舒服服的用这样的类型了,当然其他的一些在客户端生成object[]的,就需要已知类型的参与了  WCF笔记--泛型与集合数据类型_童话

最后就是自定义集合类型了

[CollectionDataContract],

注意三点

   1,集合必须是可序列化的,

   2 这个可不是我们SOA中的DataContract了,

   3 要有Add方法的支持