WCF基础之序列化
wcf是基于消息进行通信的,这篇就是简单说下序列化引擎是如何将.net object转化为xml消息。一般情况下很少用到这些,你只需定义数据协定之类的或者指定相应的序列化引擎,然后设置相应的特性就好。
序列化的方式有三种:DataContractSerializer、NetDataContractSerializer和XmlSerializer。前两种相似,简单说说说DataContractSerialier和XmlSerializer。
DataContractSerializer是默认序列化方式,要使用DataContractSerializer类,先要实例化一个该类
DataContractSerializer dcs = new DataContractSerializer(typeof(Person));
Person是一个数据协定类。在我们定义数据协定的时候有个kownType,初始化DataContractSerializer类如下:
[DataContract]
public class Person
{
}
[DataContract]
public class Man : Person
{
}
[DataContract]
public class Woman : Person
{
}
Type[] kownTypes = new Type[]{typeof(Man),typeof(Woman)};
DataContractSerialzier dcs = new DataContractSerializer(typeof(Person),kownTypes);
至于默认根名称和命名空间就不多说了,说数据协定的时候就介绍过。最大对象配额(maxItemInObjectGraph),值为整数,指定序列化和反序列化的最大项数。如下对象数为3,即本身(Test)+Num+Str,当然,里面还可嵌套其他数据协定:
[DataContract]
public class Test
{
[DataMember]
public int Num {get;set;}
[DataMember]
public string Str {get;set;}
}
往返行程是指对象反序列化和重新序列化时产生的从xml流到对象实例,再到xml流。往返行程的启用和禁止可通过ignoreExtensionDataObject参数的设置为true或者不实现IExtensibleDataObject接口(如果前面的文字描述让你对于往返行程没懂,那么你看到这个接口的时候,你应该也就明白它的用处了)。preserveObjectReferences参数(默认值为false),该参数的作用是设置对象图保留的,举个简单的例子
[DataContract]
public class PurchaseOrder
{
[DataMember]
public Address billTo;
[DataMember]
public Address shipTo;
}
[DataContract]
public class Address
{
[DataMember]
public string street;
}
Address adr = new Address();
adr.street = "123 Main St.";
PurchaseOrder po = new PurchaseOrder{billTo=adr, shipTo=adr};
//perserveObjectReferences=true
<PurchaseOrder ser:id=">
<billTo ser:id= Main st.</treet></billTo>
<shipTo ser:" />
</PurchaseOrder>
//perserveObjectReferences=false
<PurchaseOrder>
<billTo><street> Main st.</treet></billTo>
<shipTo><street> Main st.</treet></shipTo>
</PurchaseOrder>
如上,preserveObjectReferences=true时,如果一个对象被多次引用,不会被再在xml中创建该对象的节点,而是生成该对象的一个引用。注意的是当为true是,只有另一个preserveObjectReferences同样为true的DataContractSerializer才能理解;元数据不支持此功能;preserveObjectReferences=false时,需要复制对象,为true,虽不会复制对象,但是会进行额外的比较,导致序列化和反序列化进程减慢。
上面简单介绍了DataContractSerializer的构造,接下来说说序列化。
简单序列化:即使用基本的方法WriteObject,该方法使用指定的 System.IO.Stream 将对象的完整内容(开始、内容和结束)写入 XML 文档或流。

分布引导序列化:即使用WriteStartObject、WriteObjectContent和WriteEndObject分别写入结束元素,对象内容和关闭包装元素。该序列化方式有两种常见用法:一是在WriteStartObject和WriteObjectContent之间插入内容;二是完全避免使用WriteStartObject和WriteEndObject,并写入自定义的包装元素或者跳过写入包装。
反序列化最基本的方法就是调用ReadObject方法。
接下来说下XmlSerializer,XmlSerializer并非专用于WCF,它允许对生成的xml进行更多的控制并且支持更多的xml架构定义语言标准,说白点就是支持标准的xml,可以跨语言的传输。但不支持数据协定。要想将DataContractSerialzier切换到XmlSerialzier,只需在定义服务协定的时候声明XmlSerialzierFormat特性即可
[ServiceContract]
[XmlSerializerFormat]
public interface TestXmlSerialzier
{
[OperationContract]
void SaveInfo(Person p);
......
}
public class Person
{
[XmlAttribute]
public string Name{get;set;}
[XmlAttribute]
public int Age{get;set;}
}
DataContractSerializer序列化被DataContract和DataMember所标记的成员,而XmlSerialzier序列化所有的公共成员。
好了,终于迈过这个坎了!尼玛的。。。。。。
WCF基础之序列化的更多相关文章
- WCF技术剖析之一:通过一个ASP.NET程序模拟WCF基础架构
原文:WCF技术剖析之一:通过一个ASP.NET程序模拟WCF基础架构 细算起来,已经有好几个月没有真正的写过文章了.近半年以来,一直忙于我的第一本WCF专著<WCF技术剖析>的写作,一直 ...
- .net的XML对象序列化VS WCF中xml序列化问题
整理一下 .net 对象序列化注意事项: 1. 字段:必须是 public类型 2.属性:只读或者只写的属性不被序列化,只有 可读可写并且赋值的才可以 序列化: Someclass obj = new ...
- WCF服务编程 读书笔记——第1章 WCF基础(2)
续:第1章 WCF基础(1) 元数据交换 服务有两种方案可以发布自己的元数据.一种是基于HTTP-GET协议提供元数据, 另一种则是后面将要讨论的使用专门的终结点的方式.WCF能够为服务自动提供基于H ...
- Entity Framework 6 Recipes 2nd Edition(9-7)译->在WCF服务中序列化代理
9-7. 在WCF服务中序列化代理 问题 从一个查询里返回一个动态代理对象,想要把它序列为一个POCO(Plain-Old CLR Objects)对象. 实现基于POCO实体对象, 在运行时,EF会 ...
- WCF基础教程之异常处理:你的Try..Catch语句真的能捕获到异常吗?
在上一篇WCF基础教程之开篇:创建.测试和调用WCF博客中,我们简单的介绍了如何创建一个WCF服务并调用这个服务.其实,上一篇博客主要是为了今天这篇博客做铺垫,考虑到网上大多数WCF教程都是从基础讲起 ...
- 修改WCF的默认序列化格式
需求: 要用WCF生成 Restful风格的接口,返回 JOSN格式: { "AInfo": { ", "Description": ...
- WCF 基础框架
WCF 基础框架: 1,契约:契约书一语个服务公共接口的一部分,一个服务的契约定义了服务端公开的方法,使用的传递协议,可访问的地址,传输的消息格式等内容,主要包括数据契约,消息契约,服务契约等. 2, ...
- WCF服务编程 读书笔记——第1章 WCF基础(1)
第1章 WCF基础 本章主要介绍WCF的基本概念.构建模块以及WCF体系架构,以指导读者构建一个简单的WCF服务.从本章的内容中,我们可以了解到WCF的基本术语,包括地址(Address).绑定(Bi ...
- django-rest-framework 基础二 序列化器和路由
django-rest-framework 基础二 序列化器和路由 目录 django-rest-framework 基础二 序列化器和路由 1. 序列化器 1.1 Serializer的使用 1.2 ...
随机推荐
- Snapdragon profiler连不上 android手机
adb devices也是空 开发者选项里面该开的都开了 就可以了 对了数据线不对也会连不上...
- 介绍下Shell中的${}、##和%%使用范例
假设定义了一个变量为:代码如下:file=/dir1/dir2/dir3/my.file.txt可以用${ }分别替换得到不同的值:${file#*/}:删掉第一个 / 及其左边的字符串:dir1/d ...
- ECSHOP商品描述和文章里不加水印,只在商品图片和商品相册加水印
fckeditor\editor\filemanager\connectors\php //判断并给符合条件图片加上水印 if ($**tension == 'jpg' || $**tension = ...
- 2017.4.26 慕课网--Java 高并发秒杀API配置文件(持续更新)
新建项目,new maven project. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&q ...
- RAP + MOCK
前后端分离式开发的思考 目前大部分公司都实行了前后端分离开发.然而在项目开发过程当中,经常会遇到以下几个尴尬的场景: 1.前端开发依赖于后端接口数据,需要与后端接口联调才能获得数据展示,从而拖慢了开发 ...
- DNS主从服务器
一.目的: 我们知道,DNS服务器在网络服务中可能出现故障当机等状况,会导致DNS服务瘫痪,显然在实际的网络应用中我们不希望出现这种状况,所有我们就要配置从 服务器来在主DNS服务器出现故障时代替他来 ...
- JavaScript 闭包 面试题
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...
- WebService的缓存机制
分类: .NET ASP 2010-11-13 10:00 849人阅读 评论(0) 收藏 举报 webservicestring数据库nullapplicationweb服务 WebService的 ...
- 无需Root实现Android手机屏幕流畅投影到电脑进行演示(附软件下载)
近期要在公司的会议上演示App,须要在投影仪上显示出来给大家演示.因为投影仪不是智能投影仪,仅仅能将App先投影到自己的笔记本上.然后再将笔记本上的内容投影到投影仪上.该App是个游戏,实时交互性比較 ...
- 图解WinHex使用入门
一 Winhex和相关概念简单介绍 1 Winhex 是在Windows下执行的十六进制编辑软件,此软件功能很强大,有完好的分区管理功能和文件管理功能.能自己主动分析分区链和文件簇链.能对硬盘进行不同 ...