您的位置:首页 > 其它

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

2007-03-10 18:04 876 查看
... ...续Part I([原创] 我的WCF之旅(4):WCF中的序列化(Serialization)- Part I)

XMLSerializer

提到XMLSerializer,我想绝大多数人都知道这是asmx采用的Serializer。首先我们还是来看一个例子,通过比较Managed Type的结构和生成的XML的结构来总结这种序列化方式采用的是怎样的一种Mapping方式。和DataContractSerialzer Sample一样,我们要定义用于序列化对象所属的Type——XMLOrder和XMLProduct,他们和相面对应的DataContractOrder和DataContractProduct具有相同的成员。

using System;

using System.Collections.Generic;

using System.Text;

namespace Artech.WCFSerialization


using System;

using System.Collections.Generic;

using System.Text;

namespace Artech.WCFSerialization

编写Serialization的Code.

static void SerializeViaXMLSerializer()

调用上面定义的方法,生成序列化的XML。

<?xml version="1.0" encoding="utf-8"?>

<XMLOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

    <OrderID>b695fd18-9cd7-4792-968a-0c0c3a3962c2</OrderID>

    <OrderDate>2007-03-09T00:00:00+08:00</OrderDate>

    <Product>

        <ProductID>23a2fe03-d0a0-4ce5-b213-c7e5196af566</ProductID>

        <ProductName>Dell PC</ProductName>

        <UnitPrice>4500</UnitPrice>

    </Product>

    <Quantity>300</Quantity>

</XMLOrder>

这里我们总结出以下的Mapping关系:


Root Element被指定为类名。



不会再Root Element中添加相应的Namaspace。



对象成员以XML Element的形式输出。



对象成员出现的顺利和在Type定义的顺序一致。



只有Public Field和可读可写得Proppery才会被序列化到XML中——比如定义在XMLProduct中的internal string ProducingArea没有出现在XML中。



Type定义的时候不需要运用任何Attribute。


以上这些都是默认的Mapping关系,同DataContractSerializer一样,我们可以通过在Type以及它的成员中运用一些Attribute来改这种默认的Mapping。


Root Element名称之后能为类名。



可以在Type上运用XMLRoot,通过Namaspace参数在Root Element指定Namespace。



可以通过在类成员上运用XMLElement Attribute和XMLAttribute Attribute指定对象成员转化成XMLElement还是XMLAttribute。并且可以通过NameSpace参数定义Namespace。



可以在XMLElement或者XMLAttribute Attribute 通过Order参数指定成员在XML出现的位置。



可以通过XmlIgnore attribute阻止对象成员被序列化。


基于上面这些,我们重新定义了XMLProduct和XMLOrder。

using System;

using System.Collections.Generic;

using System.Text;

using System.Xml.Serialization;

namespace Artech.WCFSerialization


using System;

using System.Collections.Generic;

using System.Text;

using System.Xml.Serialization;

namespace Artech.WCFSerialization



重新进行一次Serialization。我们可以得到下面的XML。

<?xml version="1.0" encoding="utf-8"?>

<XMLOrder id="9a0bbda4-1743-4398-bc4f-ee216e02695b" xmlns="http://artech.wcfSerialization/Samples/Order" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

  <product id="4e3aabe5-3a51-4000-9fd8-d821d164572a" xmlns="Http://Artech.WCFSerialization/Samples/Product">

    <name>Dell PC</name>

    <producingArea>Xiamen FuJian</producingArea>

    <price>4500</price>

  </product>

  <quantity>300</quantity>

  <date>2007-03-09T00:00:00+08:00</date>

</XMLOrder>

分析完XMLSerializer的Serialization功能,我们照例来分析它的反向过程—Deserialization。下面的Deserialization的Code。

static void DeserializeViaXMLSerializer()

调用DeserializeViaXMLSerializer,得到下面的Screen Shot。下面显示的Order对象的信息和我们利用DataContractSerializaer进行Deserialization是的输出没有什么两样。不过有趣的是上面多出了两行额外的输出:The constructor of XMLProduct has been invocated! The constructor of XMLOrder has been invocated。而这个操作实际上是定义在XMLProduct和XMLOrder的默认(无参)构造函数里的。所此我们可以得出这样的结论——用XMLSerializer进程Deserialization,会调用的默认(无参)构造函数来初始化对象。



DataContractSerializer V.S. XMLSerializer

上面我们分别分析了两种不同的Serializer,现在我们来简单总结一下他们的区别:



特性



XMLSerializer



DataContractSerializer





默认Mapping



所有Public Field和可读可写Property



所有DataMember Filed、Property





是否需要Attribute



不需要



DataContract DataMember或者Serializable





成员的默认次序



Type中定义的顺序



字母排序





兼容性



.asmx



Remoting





Deserialzation



调用默认构造函数



不会调用




WCF相关内容:

[原创]我的WCF之旅(1):创建一个简单的WCF程序

[原创]我的WCF之旅(2):Endpoint Overview

[原创]我的WCF之旅(3):在WCF中实现双向通信(Bi-directional Communication)

[原创]我的WCF之旅(4):WCF中的序列化(Serialization)- Part I

[原创]我的WCF之旅(4):WCF中的序列化(Serialization)- Part II

[原创]我的WCF之旅(5):Service Contract中的重载(Overloading)

[原创]我的WCF之旅(6):在Winform Application中调用Duplex Service出现TimeoutException的原因和解决方案

[原创]我的WCF之旅(7):面向服务架构(SOA)和面向对象编程(OOP)的结合——如何实现Service Contract的继承

[原创]我的WCF之旅(8):WCF中的Session和Instancing Management

[原创]我的WCF之旅(9):如何在WCF中使用tcpTrace来进行Soap Trace

[原创]我的WCF之旅(10): 如何在WCF进行Exception Handling

[原创]我的WCF之旅(11):再谈WCF的双向通讯-基于Http的双向通讯 V.S. 基于TCP的双向通讯

[原创]我的WCF之旅(12):使用MSMQ进行Reliable Messaging

[原创]我的WCF之旅(13):创建基于MSMQ的Responsive Service
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: