在WCF中,提供了专门用来序列化和反序列操作的类,该类就是DataContractSerializer类。一般而言,WCF会自动选择使用DataContractSerializer来对可序列话数据契约进行序列化,不需要开发者直接调用。WCF除了支持DataContractSerializer类来进行序列化外,还支持另外两种序列化器,这两种序列化器分别为:XMLSerializer(定义在System.XML.Serialization namespace)和NetDataContractSerializer (定义在System.XML.Serialization namespace)。XmlSerializer类不是WCF专用的类,Asp.net Web服务统一使用该类作为序列化器,但XmlSerializer类支持的类少于DataContractSerializer列支持的类型,但它允许对生成的XML进行更多的控制,并且支持更多的XML架构定义语言(XSD)标准。它不需要在可序列化类上有任何声明性的属性。

DataContractSerializer类与NetDataContractSerializer类类似,它们之间主要的区别在于:在使用NetDataContractSerializer进行序列化时,不需要指定序列化的类型,如:

aNetDataContractSerializer serializer =
new NetDataContractSerializer(); // 不需要明确指定序列化的类型
serializer.WriteObject(writer, p); // 而使用DataContractSerializer需要明确指定序列化的类型
DataContractSerializer serializer =
new DataContractSerializer(typeof(Order)); // 需要明确指定序列化的类型
serializer.WriteObject(writer, p);

使用DataContractSerializer类生成的XML文件与原始对象之间的映射关系如下(默认情况):

1. Root Element为对象的Type Name——DataContractOrder

2. Type的Namespace会被加到XML根节点的Namespace中

3. 对象的所有成员以XML Element的形式而不是以XML Attribute的形式输出。

4. 所以对象在XML的输出顺序是按照字母排序。

5. 所有成员的Elelement 名称为成员名称。

6. 不论成员设置怎样的作用域(public,protected,internal,甚至市Private),

所有运用了DataMemberAttribute的成员均被序列化到XML中,

7. Type和成员必须运用DataContractAttribute和DataMemberAttribute才能被序列化。

可以通过这两个Attribute(DataContractAttribute和DataMemberAttribute)制定相关的参数来生成所需的XML 结构

1. Root Element可以通过DataContractAttribute中的Name参数定义。

2. Namespace可以通过DataContractAttribute中的NameSpace参数定义。

3. 对象的成员只能以XML Element的形式被序列化。

4. 对象成员对应的XML Element在XML出现的位置可以通过DataMemberAttribute的Order参数来定义。

5. 对象成员对应的Element的名称可以通过DataMemberAttribute中的Name定义。

6. 如果不希望某个成员输出到XML中,可以去掉成员对应的DataMemberAttribute Attribute。

此外DataMemberAttribute还有连个额外的参数:

1. IsRequired:制定该成员为必须的,如果通过工具生成XSD的话,对应的Element的minOccur=“1”

2. EmitDefaultValue:制定是否输入没有赋值的成员(值为默认值)是否出现在XML中。

注:因为WCF中使用DataContractSerializer进行序列化和反序列化的,由于DataContractSerializer进行序列化和反序列化时,都必须事先确定对象的类型。如果被序列化对象或反序列化生成的对象包含不可知的类型,序列化或反序列化将失败。所以为了保证DataContractSerializer正常的序列化和反序列化,需要将“未知”类型加入DataContractSerializer“已知”类型列表中。可以通过两个特性设置:KnownTypeAttribute和ServiceKnownTypeAttribute。KnownTypeAttribute应用于数据契约中,用于设置继承于该数据契约类型的子数据契约,或引用其他的契约类型。ServiceKnownTypeAttribute既可以应用于服务契约的接口和方法上,还可以应用在服务实现的类和方法上,应用在不同的目标元素,决定了定义已知类型的作用范围

使用XmlSerializer类生成的XML文件与原始对象之间的映射关系如下(默认情况):

1.Root Element被指定为类名。
2.不会再Root Element中添加相应的Namaspace。
3.对象成员以XML Element的形式输出。
4.对象成员出现的顺利和在Type定义的顺序一致。
5.只有Public Field和可读可写得Proppery才会被序列化到XML中——比如定义在XMLProduct中的internal string ProducingArea没有出现在XML中。
6.Type定义的时候不需要运用任何Attribute。

可以通过XML相关的一些Attribute来生成所需的XML 结构

1.Root Element名称之后能为类名。
2.可以在Type上运用XMLRoot,通过Namaspace参数在Root Element指定Namespace。
3.可以通过在类成员上运用XMLElement Attribute和XMLAttribute Attribute指定对象成员转化成XMLElement还是XMLAttribute。并且可以通过NameSpace参数定义4.Namespace。
5.可以在XMLElement或者XMLAttribute Attribute 通过Order参数指定成员在XML出现的位置。
6.可以通过XmlIgnore attribute阻止对象成员被序列化。

两种不同的Serializer区别:

特性

XMLSerializer

DataContractSerializer

默认Mapping

所有Public Field和可读可写Property

所有DataMember Filed、Property

是否需要Attribute

不需要

DataContract DataMember或者Serializable

成员的默认次序

Type中定义的顺序

字母排序

兼容性

.asmx

Remoting

Deserialzation

调用默认构造函数

不会调用

 

该篇文章参考和引用了以下作者的文章内容:

我的WCF之旅(4):WCF中的序列化[上篇]

我的WCF之旅(4):WCF中的序列化[下篇]

跟我一起学WCF(7)——WCF数据契约与序列化详解

文章同步发表于我的个人网站:http://www.zuowenjun.cn/post/2015/03/25/134.html

WCF序列化的更多相关文章

  1. [转载]WCF序列化65536大小限制的问题

    错误: The formatter threw an exception while trying to deserialize the message: There was an error whi ...

  2. wcf序列化嵌套类(如TreeNode)异常原因

    循环引用类在WCF中的传递 循环引用类在WCF中的传递问题,例如: [DataContract]    public class AB    {        public string name { ...

  3. WCF初探-24:WCF序列化和反序列化

    前言 WCF包含很多封装的内部机制,这些是我们在编写程序时不会经常看到的.比如上一篇讲解的Message.这一篇我将讲解WCF的另一种内部机制,WCF的序列化和反序列化.通常我们在编写WCF服务程序的 ...

  4. WCF序列化与反序列化问题

    转自:http://www.cnblogs.com/wangweimutou/p/4505447.html WCF包含很多封装的内部机制,这些是我们在编写程序时不会经常看到的.比如上一篇讲解的Mess ...

  5. Wcf序列化的循环引用问题1

    1.Wcf数据契约序列化,使用的类DataContractSerializer 默认如果类不指定[DataContract],则序列化类的所有字段,并且在出现循环引用的时候回抛出异常,服务终止 msd ...

  6. Web重温系列(一):利用寄宿于IIS的WCF序列化文件

    这两年一直在做WinForm,对于Web已经比较生疏了,其实之前做的也不是很多. 这两天做了一个小工具,功能很简单,就是想有个地方存放办公室同事的机器名和IP的信息,包括附加的用户名和更新时间.比较之 ...

  7. wcf序列化大对象时报错:读取 XML 数据时,超出最大

    错误为: 访问服务异常:格式化程序尝试对消息反序列化时引发异常: 尝试对参数 http://tempuri.org/ 进行反序列化时出 错: request.InnerException 消息是“反序 ...

  8. WCF - 序列化

    数据是信息的载体 在不同环境中有不同的类型 为保证处于不同平台的的应用能够正常的进行数据交互 必须采用一种双方都能理解的数据类型 XML无疑是最好的选择 但不是唯一的选择 例如JSON也是一种普遍认可 ...

  9. 在 WCF 中使用高效的 BinaryFormatter 序列化

    本文将定义一个 WCF 终结点行为扩展,以在 WCF 中使用更高效的 BinaryFormatter 进行二进制序列化,并实现对是否使用传统二进制序列化功能的可配置. 介绍 实现步骤 使用方法 效果 ...

随机推荐

  1. 【菜鸟玩Linux开发】在C++里操作MySQL

    MySQL是一个的开源关系型数据库,对于服务端开发来说是一个优秀的选择.本篇内容将介绍如何在C++程序里操作MySQL数据库. ———————————————————————————————————— ...

  2. 作业二--注册GitHub的过程

    第一步:打开GitHub官网https://github.com/,在界面中输入账号名称.邮箱.密码,然后点击注册按钮. 第二步:注册完成后,选择Free免费账号完成初始设置. 第三步:验证邮箱,打开 ...

  3. 用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连。

    最近在看算法,看到这个题,觉得挺经典的,收起. 分析: 1 .把问题归结为图结构的遍历问题.实际上6个数字就是六个结点,把六个结点连接成无向连通图,对于每一个结点求这个图形的遍历路径,所有结点的遍历路 ...

  4. 关于Windows窗口框架

    我们知道Windows的窗口消息处理函数是C方式, 面向过程的, 所以窗口框架的基本任务就是将它转成面向对象的方式, 确切的说如何将消息处理函数第一参数HWND转成对象指针. 关于这个问题, 其实网上 ...

  5. vim添加或删除多行注释

    一.多行注释的添加 1. vim的命令模式下(ESC 进入命令模式): 2. 按CTRL+V进入可视化模式(VISUAL BLOCK): 注意:vim命令模式下v进入的是visual模式,ctrl+v ...

  6. 使用Vue.js时,对Chrome控制台的一点小心得

    之前对Chrome控制台的console.log()输出没太放心上,其实仔细研究后,对工作效率有显著的提示.看下面的五段代码: console.log(''); console.log(typeof ...

  7. Bootstrap~表单Form

    回到目录 在进行自己的后台改版时,大体布局都使用了bootstrap,剩下的表单部分没理由不去使用它,对于表单的美化和布局,bootstrap做的也是很不错的,有大气的边框,多功能的按钮及宏观的表单布 ...

  8. GridView和DATAGRID前后台查询用法的比较

    Grideview前台: <DIV class="mainDiv" id="GridWidth"> <ASP:GridView id=&quo ...

  9. salesforce 零基础学习(三十八)Translate 的使用(国际化处理)

    本篇参考:http://resources.docs.salesforce.com/200/17/en-us/sfdc/pdf/salesforce_workbench_cheatsheet.pdf ...

  10. html5 浏览器端数据库

    为什么使用浏览器端数据库:随着浏览器的处理能力不断增强,越来越多的网站开始考虑,将大量数据储存在客户端,这样可以减少用户等待从服务器获取数据的时间. 一.localStorage  — 本地存储  可 ...