WCF序列化流程

序列化

默认用户自定义类型(类和结构)并不支持序列化,因为.NET无法判断对象状态是否需要反射到流。 用户自定义类的实例支持序列化 需要添加[Serialazable]。若要允许可序列化类型包含非序列化的成员变量可使用[NonSerializad]

.Net格式器

BinaryFormatter 序列化为二进制格式
SoapFormatter 使用.NET 特定的SOAP XMl格式
两者格式器都实现IFormatter接口

两种格式器都要将类型的程序集及版本控制器信息持久化到流中,以保证序列化的对象能够被反序列化为正确的类型。

WCF格式器

使用[DataContract]进行标记类,使用[DataMember]标记成员
DataContractSerializer格式器继承XmlObjectSerializer。
在未曾标记DataContract特性,WCF就会自动推断,认为DataContract特性被应用到该类型上,且它的所有仅有成员(字段或属性)均被应用了DataMember特性。
组合数据契约:定义数据契约,对那些本身就是数据契约的成员也可以使用DataMember特性。-数据契约具有递归性质
数据契约事件 serializing发生成在序列化之前,serialized事件发生在序列化后,desrializing发生在反序列化之前,desreialized发生在反序列化之后

每个序列化事件处理方法都必须遵循如下的方法签名 void <Method Name>(StreamingContext context)

WCF在反序列化前必须创建一个对象,但是,WCF不会调用数据契约类的默认构造函数。

数据契约层级

WCF要求类层级的每一级数据契约都必须标记DataContract特性,该特性不可继承。WCF可以在类层级混合使用Serializable和DataContract特性
WCF不能接收子类型数据,只能使用[KnownType(typeof(subclass))] 或[ServiceKnownType(typeof(SubClass))]

配置文件方法

 <add type="Contact,MyClassLibrary">
<knownType type="Customer,MyOtherClassLibrary"/>
</add>

使用配置文件主要解决的问题是:当添加一个新的子类时必须修改代码、重新编译和重新部署。

序列化顺序

在类型内部,默认的序列化顺序是按照字母的排序的,至于整个类层级的顺序,则是自上而下的。在序列化顺序不匹配的情况下,成员则以它们的值进行初始化。 自定义顺序可以使用[DataMember]的Order属性值进行调整,该属性的默认值为-1,也就是它默认WCF顺序

成员的Order属性设置了相同的值,WCF会按照成员的字母顺序排序

版本控制

  • 新增成员;
    任何一端添加新的成员,然后将新的契约发送到旧的客户端或服务。在反序列化这样的数据契约类型时,DataContractSerializer会忽略新增成员。
  • 缺失成员;
    客户端是针对旧的数据契约定义编写的,而与之交互的服务则是根据定义了新成员的契约定义编写的。当接收端的DataContractSerializer在消息中无法找到所需信息去反序列化的这些成员时,会根据成员的值进行反序列化。也就是说,将引用类型设置为null,将值类型设置为0。
  • 双向传递,即新的数据契约与旧版本的数据契约之间相互传递,它同时需要向后与向前的兼容性。

    枚举

    枚举类型总是支持序列化的。不必应用DataContract特性,如果要将确定的枚举值排除于数据契约之外,就需要在枚举类型标记DataContract特性,并在枚举值明确标记为[EnumMember]特性,没有标记EnumMember毛发的枚举值不属于该枚举的数据契约。同时可以使用该特性的Value属性对枚举值设置别名。

    泛型

    不能定义包含了泛型类型参数的数据契约。便可以在数据契约中使用限定的泛型数据,只要在服务契约中指定了类型参数。
    数据契约被重命名的格式为:<原有名>Of<类型参数><散列值>
    同时也可以使用[DataContract(Name=”ClassNameOf{0}{1}”)]表示。标识符中的数字就是类型参数的序数,可以用{#}表示为散列值

    集合

    在使用集合接口IEnumberable,IList和ICollection,它他的传输型表示形式都使用了数组

    如果契约中的集合为具体集合类型,而且属于可序列化集合(标记为Serializable特性而不是DataContract特性),那么,只要提供的集合包含Add()方法,WCF就能够自动地将集合规范为数组类型。

    CollectionDataContract特性:该特性会检验Add()方法及检查IEumerable或IEnumerable接口是否存在。如果不存在,就会导致InvlidDataContractException异常。注:DataContract不能和CollectionDataContract一起使用

WCF服务编程——数据契约快速入门的更多相关文章

  1. WCF服务编程 读书笔记——第2章 服务契约

    操作重载诸如 C++ 和 C# 等编程语言都支持方法重载,即允许具有相同名称的两个方法可以定义不同的参数.例如,如下的 C# 接口就是有效的定义: interface ICalculator { in ...

  2. WCF服务编程 读书笔记——第1章 WCF基础(2)

    续:第1章 WCF基础(1) 元数据交换 服务有两种方案可以发布自己的元数据.一种是基于HTTP-GET协议提供元数据, 另一种则是后面将要讨论的使用专门的终结点的方式.WCF能够为服务自动提供基于H ...

  3. WCF服务编程 读书笔记——第1章 WCF基础(1)

    第1章 WCF基础 本章主要介绍WCF的基本概念.构建模块以及WCF体系架构,以指导读者构建一个简单的WCF服务.从本章的内容中,我们可以了解到WCF的基本术语,包括地址(Address).绑定(Bi ...

  4. WCF服务编程-基础

    WCF是微软建立新一代的分布式应用及面向服务应用的标准平台,是基于原有.NET Framework 2.0的扩展.虽然在WCF发布不久就已经在项目中使用WCF技术了.但是由于在项目中还没有较大规模的应 ...

  5. WCF服务编程

    WCF服务编程, 我是WCF的初学者,在这想分享学习WCF服务编程的过程,欢迎大家多多指教!

  6. WCF服务编程中使用SvcMap实现类型共享等技巧【转】

    原文链接:http://www.cr173.com/html/19026_1.html 国外的一篇文章:Sharing DataContracts between WCF Services 文中提到的 ...

  7. wcf服务编程(第3版)文摘

    第1章 wcf基础 什么是wcf: System.ServiceModel.dll 服务 服务的执行边界: proxy 地址:http/https,tcp,ipc,peer newwork,msmq, ...

  8. 【网络编程】TCPIP_1_快速入门

    目录 前言 1. 快速入门 1.1 服务端编程简要步骤 1.2 客户端编程简要步骤 1.3 参考 前言 说明: demo 基于 Linux. 1. 快速入门 以下步骤简略了很多细节,但是通过下面的几个 ...

  9. WCF中的数据契约(DataContract)

    服务契约定义了远程访问对象和可供调用的方法,数据契约则是服务端和客户端之间要传送的自定义数据类型. 一旦声明一个类型为DataContract,那么该类型就可以被序列化在服务端和客户端之间传送,如下所 ...

随机推荐

  1. git-gui:使用终端打开以后出现错误提示 Spell checking is unavable

    参考链接:http://www.lai18.com/content/10706682.html 安装了git-gui,打开以后出现以下提示: Spell checking is unavable: e ...

  2. 关于学习Lisp的一点思考

    以前读<黑客与画家>,其中对Lisp语言的赞美和推崇,让我燃起学习Lisp语言的强烈冲动,但很快发现在实际工作中应用的场景很少,出于功利心最终放弃了.直到上周未在家里读完了<大教堂与 ...

  3. UIWebView全解

    是iOS内置的浏览器控件,可以浏览网页.打开文档等 能够加载html/htm.pdf.docx.txt等格式的文件 系统自带的Safari浏览器就是通过UIWebView实现的 MIME的英文全称是“ ...

  4. MongoDB远程定时备份与还原

    全手打原创,转载请标明出处:https://www.cnblogs.com/dreamsqin/p/10885165.html,多谢~=.= 备份命令mongodump脚本语法及各项参数含义 mong ...

  5. 重温Javascript(一)-基本概念

    工作中要用到JavaScript,一组复习笔记. 一些看法 1. 想想JavaScript目前最常用的宿主环境,浏览器或者服务端V8,都是单线程,所以不用过多的考虑并发的问题,如果是协程来实现异步的方 ...

  6. 卓越管理的实践技巧(3)推动团队管理的要点 Facilitation Essentials for Managers

    Facilitation Essentials for Managers 前文卓越管理的秘密(Behind Closed Doors)最后一部分提到了总结的13条卓越管理的实践技巧并列出了所有实践技巧 ...

  7. python_89_configparser模块

    用于生成和修改常见配置文档,当前模块的名称在 python 3.x 版本中变更为 configparser.在python2.x版本中为ConfigPsresr 来看一个好多软件的常见文档格式如下 [ ...

  8. java从键盘输入三个整数,实现从小到大排序

    package study01; import java.util.Scanner; public class Sort { /** * 需求:由键盘输入三个整数分别存入变量a.b.c,对他们进行 排 ...

  9. ios下通过webservice获取数据

    经历了两天的摸索,终于成功获取了数据,因为公司要做一个停车入库的信息查询,所以需要访问webservice的接口,由于没有接触过webservice,所以第一天就是各种搜索资料,类库,各种尝试,甚至是 ...

  10. [vijos]P1979 NOIP2015 信息传递

    描述 有 n 个同学(编号为 1 到 n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为 i 的同学的信息传递对象是编号为 TiTi 的同学. 游戏开始时,每人都只知道 ...