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. edittext 设置不自动获取焦点

    给父级控件 设置两个属性,可以把焦点抢夺过去,最好是没有任何事件的父级控件(本人比较喜欢在xml文件的跟布局设置,因为页面的跟布局一般情况下,是不会设置任何事件的) android:focusable ...

  2. 科学效法自然:微软研究人员测试AI控制的滑翔机

    编者按:正如一颗苹果砸出了万有引力,自然界所有存在的事物和现象都有其科学合理的一面,小小的鸟儿也能够给科学带来丰富的灵感和启示. 最近,微软研究人员从自然出发,研究鸟类能够自由停留在空中的科学原理,并 ...

  3. HDU 2188 悼念512汶川大地震遇难同胞——选拔志愿者(巴什博弈)

    思路:若能给对方留下m+1,就可以胜.否则败. #include <iostream> using namespace std; int main() { int t,n,m;cin> ...

  4. [中文翻译] ASP.NET 5 简介(Introducing ASP.NET 5,原作ScottGu 2015/2/23)

    本文出处  [中文翻译] ASP.NET 5 简介(Introducing ASP.NET 5,原作ScottGu 2015/2/23) 这是我的文章备份 http://www.dotblogs.co ...

  5. 你会如何给全局对象添加toString()方法

    首先,在讨论如何给所有方法window对象添加toString方法的时候,我们先来说说window的对象继承与对象实例,以及构造函数的this指针,还有变量的提升与方法的调用方式,最终一探window ...

  6. UVALive 3983 Robotruck (单调队列,dp)

    如果状态定义为序号和重量的话,决策就是下一个垃圾捡或者不减,但是状态数太多了. 如果只定义序号作为状态的话,决策就变成从前面的某个j一直捡到i才送回垃圾. 这就变成了一个区间选最小值的问题,用单调队列 ...

  7. Codeforces Round #321 (Div. 2) C Kefa and Park(深搜)

    dfs一遍,维护当前连续遇到的喵的数量,然后剪枝,每个统计孩子数量判断是不是叶子结点. #include<bits/stdc++.h> using namespace std; ; int ...

  8. bzoj3209:3209: 花神的数论题

    觉得还是数位dp的那种解题形式但是没有认真的想,一下子就看题解.其实还是设置状态转移.一定要多思考啊f[i][j]=f[i-1][j]+g[i-1][j] g[i][j]=f[i-1][j-1]+g[ ...

  9. intellij idea自定义快捷键

    intellij idea自定义快捷键比较简单,自带. 首先进入idea,File-->Settings-->Live Templates. 点击右上方的“+”,第一次需要创建一个分组. ...

  10. 拨出网线后,网卡IP丢失

    /etc/network/interfaces与NetworkManager 问题:在Centos7上把网线拨出后,发现网卡状态是down,并且网卡上的IP丢失 原因:此网卡被NetworkManag ...