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. JSP Response Set Status

    JSP Response Set Status In this tutorial you will learn about how to set the HTTP status code in JSP ...

  2. Linux C存取效率对照——堆、栈、常量区

    本文主要探讨堆和栈在使用中的存取效率.利用宏汇编指令分析訪存情况来进行简单推断. 实验环境及使用工具:i686,32位Ubuntu Linux.gcc (Ubuntu/Linaro 4.6.3-1ub ...

  3. java GC optimization, G1GC

    引用    http://www.avricot.com/blog/?post/2010/05/03/Get-started-with-java-JVM-memory-(heap%2C-stack%2 ...

  4. 批量删除Redis中的key

    bin/redis-cli -h 192.168.46.151 -p 6379 keys "rulelist*" | xargs bin/redis-cli  -h 192.168 ...

  5. zabbix agent被动模式配置

    zabbix agent检测分为主动(agent active)和被动(agent)两种形式,主动与被动的说法均是相对于agent来讨论的.简单说明一下主动与被动的区别如下: 主动:agent请求se ...

  6. Elasticsearch安装(四), elasticsearch head 插件安装和使用。

    安装方式如下: 一.安装Elasticsearch-Head 1.插件安装方式(推荐) #在Elasticsearch目录下 $/bin/plugin -install mobz/elasticsea ...

  7. C语言之基本算法33—矩阵的基本运算

    //矩阵基础 /* ================================================================== 题目:输入矩阵a,b,输出a,b,a的转置矩阵 ...

  8. C. Glass Carving (CF Round #296 (Div. 2) STL--set的运用 &amp;&amp; 并查集方法)

    C. Glass Carving time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  9. 如何为Apache JMeter开发插件(一)

    本文转载于http://blog.csdn.net/column/details/12925.html,作者:xreztento 作者写的很精华,我打算在此系列操作一遍后,加多点截图,便于更多人更快上 ...

  10. 隐藏ion-nav-back-button的文字

    <ion-nav-bar class="bar-positive"> <ion-nav-back-button> </ion-nav-back-but ...