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基础之序列化的更多相关文章

  1. WCF技术剖析之一:通过一个ASP.NET程序模拟WCF基础架构

    原文:WCF技术剖析之一:通过一个ASP.NET程序模拟WCF基础架构 细算起来,已经有好几个月没有真正的写过文章了.近半年以来,一直忙于我的第一本WCF专著<WCF技术剖析>的写作,一直 ...

  2. .net的XML对象序列化VS WCF中xml序列化问题

    整理一下 .net 对象序列化注意事项: 1. 字段:必须是 public类型 2.属性:只读或者只写的属性不被序列化,只有 可读可写并且赋值的才可以 序列化: Someclass obj = new ...

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

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

  4. Entity Framework 6 Recipes 2nd Edition(9-7)译->在WCF服务中序列化代理

    9-7. 在WCF服务中序列化代理 问题 从一个查询里返回一个动态代理对象,想要把它序列为一个POCO(Plain-Old CLR Objects)对象. 实现基于POCO实体对象, 在运行时,EF会 ...

  5. WCF基础教程之异常处理:你的Try..Catch语句真的能捕获到异常吗?

    在上一篇WCF基础教程之开篇:创建.测试和调用WCF博客中,我们简单的介绍了如何创建一个WCF服务并调用这个服务.其实,上一篇博客主要是为了今天这篇博客做铺垫,考虑到网上大多数WCF教程都是从基础讲起 ...

  6. 修改WCF的默认序列化格式

    需求:         要用WCF生成 Restful风格的接口,返回 JOSN格式: { "AInfo": { ", "Description": ...

  7. WCF 基础框架

    WCF 基础框架: 1,契约:契约书一语个服务公共接口的一部分,一个服务的契约定义了服务端公开的方法,使用的传递协议,可访问的地址,传输的消息格式等内容,主要包括数据契约,消息契约,服务契约等. 2, ...

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

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

  9. django-rest-framework 基础二 序列化器和路由

    django-rest-framework 基础二 序列化器和路由 目录 django-rest-framework 基础二 序列化器和路由 1. 序列化器 1.1 Serializer的使用 1.2 ...

随机推荐

  1. Timeline简单配置

    Timeline是一个Jquery时间轴插件.效果如图 获取地址:https://github.com/ka215/jquery.timeline 配置 (1)html表头加入 <link re ...

  2. ASP.NET MVC学习---(九)权限过滤机制(完结篇)

    相信对权限过滤大家伙都不陌生 用户要访问一个页面时 先对其权限进行判断并进行相应的处理动作 在webform中 最直接也是最原始的办法就是 在page_load事件中所有代码之前 先执行一个权限判断的 ...

  3. FizzBuzz and Fibonacci优化

    ***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...

  4. PS如何使用制作图片投影效果

    如果仅仅是同样大小的背景(灰色或者黑色),则只要新建一个和比原图大三个像素的文件(比如这里原图片为100×100,我就建立一个103×103的文件)把图片放在左上角,剩下的部分填充灰色或者黑色.然而这 ...

  5. 网络编程 TCP学习

    上传txt文本 通过socket向服务端发送数据 然后用serversocket 接收socket 通过流读取数据保存 服务端在发送确认信息并在client输出 client import java. ...

  6. Wamp访问缓慢、本地主机访问缓慢解决方案

    Wamp访问缓慢.本地主机访问缓慢解决方案 Wamp访问速度缓慢可能的原因:          1.一般原因: Wamp的日志文件太大.处理办法,将位于wamp/logs/下的日志文件清空.     ...

  7. 小猪的Git使用总结

    小猪的Git使用总结 文件夹 小猪的Git使用总结 安装配置与文档 下载安装 文档教程相关 概念 Git的四个组成部分 文件的几个状态 Git与SVN版本号版本号控制存储差异 每次Commit时仓库中 ...

  8. POJ 3687:Labeling Balls(优先队列+拓扑排序)

    id=3687">Labeling Balls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10178 Acc ...

  9. 定制一个类似地址选择器的view

    代码地址如下:http://www.demodashi.com/demo/12832.html 前言: 这几天也是闲来无事,看看有什么和Scroller相关的控件需要巩固下,原因很简单,前几天看到相关 ...

  10. Vue-cli + Express 构建的SPA Blog(前后分离)

    代码地址如下:http://www.demodashi.com/demo/12526.html 为什么学习并使用Vue 1.发展趋势 最近这几年的前端圈子,由于戏台一般精彩纷呈,从 MVC 到 MVV ...