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. jQuery知识点小结

    博主之前学习一段时间后做了点Demo,借此机会发出来分享,其实学jQuery只要简单看看文档即可,但有些细枝末节的东西文档会默认使用者是了解的,所以还是得系统学习系统训练:Talk is cheap, ...

  2. webstorm增加内存配置参数

    webstorm增加内存配置参数 找到WebStorm.exe.vmoptions这个文件,路径如下 webstorm安装主目录>bin>WebStorm.exe.vmoptions 更改 ...

  3. swift基础-2

    一.基本运算符 let a = 5 var b = 10 b = a if a = b{ swift 中赋值运算符,并不将自身作为一个值进行返回,所以编译不合法,帮开发者避免错误,很人性化的语言 } ...

  4. Intellij IDEA项目添加资源文件

    添加了一个资源文件,但读取的时候出错了 prop.load(Config.class.getResourceAsStream("/resources/dbconfig.properties& ...

  5. mac不限速下载百度网盘

    本文转载自:https://blog.csdn.net/u010837612/article/details/80029212 相信大家都比较困惑,百度网盘客户端限速后一般只有几十K的下载速度,Win ...

  6. 本号讯 | 微软和百度携手推进全球自动驾驶技术; 微软发布新一代可垂直可水平滚动的Arc鼠标

    7 月 13 日,微软宣布了与宝马的最新合作进展,继语音助手 Cortana .云服务 Azure.Office 365 和微软 Exchange 安装在部分宝马车型后——Skype for Busi ...

  7. ES6, Angular,React和ABAP中的String Template(字符串模板)

    String Template(字符串模板)在很多编程语言和框架中都支持,是一个很有用的特性.本文将Jerry工作中使用到的String Template的特性做一个总结. ES6 阮一峰老师有一个专 ...

  8. SAP标准培训课程C4C10学习笔记(一)第一单元

    C4C10:SAP Hybris Cloud for Customer Administration 课程目录: 第一单元是C4C的简介. 作为SAP推出的一个SaaS(Software as a s ...

  9. CF Gym 100187E Two Labyrinths (迷宫问题)

    题意:问两个迷宫是否存在公共最短路. 题解:两个反向bfs建立层次图,一遍正向bfs寻找公共最短路 #include<cstdio> #include<cstring> #in ...

  10. stixel-world和psmnet结合出现的问题

    float32位,4字节 原本的stixel-world是用sgbm生成深度图,并且转成了float型 psmnet保存最终的disparity图是保存成uint16的,skimage.io.imsa ...