WCF序列化各种方式详解
创始人
2024-06-23 07:30:19
0

WCF是一款由微软公司开发的一款功能强大的工具,可以为开发人员轻松的创建一个安全性较高的解决方案。在这里我们就先为大家详细介绍一下有关WCF序列化的相关概念,希望能给大家带来一些帮助。

大家知道,WCF内置了两种序列化方式,DataContractSerializer和NetDataContractSerializer。WCF序列化的基本概念Artech兄已经说得很清楚了,在此不再赘述,本文仅就此二者的区别作一番探讨。

先来看看两者的声明:

  1. public sealed class DataContractSerializer : XmlObjectSerializer  
  2. {   
  3. public DataContractSerializer(Type type);   
  4. … public override object ReadObject(XmlReader reader);  
  5. public object ReadObject(Stream stream);   
  6. public void WriteObject(Stream stream, object graph);  
  7. public override void WriteObject(XmlWriter writer, object graph); …   
  8. }   
  9. public sealed class NetDataContractSerializer : 
    XmlObjectSerializer, IFormatter  
  10. {  
  11. public NetDataContractSerializer();   
  12. … public object Deserialize(Stream stream);   
  13. public void Serialize(Stream stream, object graph);  
  14. public override object ReadObject(XmlReader reader);  
  15. public object ReadObject(Stream stream);   
  16. public void WriteObject(Stream stream, object graph);  
  17. public override void WriteObject(XmlWriter writer, object graph);   
  18. …} 

其中两者的ReadObject(Straem)、WriteObject(Stream, object)的实现继承自基类XmlObjectSerializer,其他方法均为已覆写或实现。 #t#

从两个类型的声明中可以看出NetDataContractSerializer实现了IFormatter接口,而DataContractSerializer没有,因此只有NetDataContractSerializer能使用.NET基础结构中的序列化,而DataContractSerializer则是专用于WCF的。

还有一个细节DataContractSerializer的Constructor有一个Type类型的参数,而NetDataContractSerializer没有。这可蕴藏着深意啊,读者接着看就明白了。

 

现在,再来看看此二者的最大关键区别吧!从一个WCF序列化示例开始吧:

  1. [DataContract]  
  2. public class Sub   
  3. {   
  4. // Fields [DataMember]   
  5. public int Id;   
  6. [DataMember]   
  7. public string Name;   
  8. // Methods   
  9. public Sub() {}   
  10. public Sub(int id, string name) {   
  11. this.Id = id; this.Name = name;   
  12. }} 

以上是一个再简单不过的DataContract的,把他给序列化看看出来些啥。

 

先用DataContractSerializer序列化:

 

 

  1. Sub sub = new Sub(9, "nine");  
  2. DataContractSerializer dcs = new DataContractSerializer(typeof(Sub));  
  3. MemoryStream stream = new MemoryStream();  
  4. dcs.WriteObject(stream, sub);  
  5. byte[] buf = stream.ToArray();  
  6. string str = Encoding.UTF8.GetString(buf, 0, buf.Length); 

 

执行完以上代码后,str的值为:

 

 

 

  1. < Sub xmlns="http://schemas.datacontract.org/2004/07/
    ServiceInterface" xmlns:i="http://www.w3.org/2001/
    XMLSchema-instance">   
  2. < Id>10< /Id>   
  3. < Name>nine< /Name>   
  4. < /Sub> 

 

恩,此SOAP消息那是相当得正常。然后将同一个对象用NetDataContractSerializer序列化:

  1. NetDataContractSerializer ndcs = new NetDataContractSerializer();  
  2. MemoryStream nstream = new MemoryStream();  
  3. ndcs.WriteObject(nstream, sub);  
  4. byte[] nbuf = nstream.ToArray();  
  5. string nstr = Encoding.UTF8.GetString(nbuf, 0, nbuf.Length); 

 

观察一下nstr的值:

  1. < Sub z:Id="1" z:Type="ServiceInterface.Sub" z:Assembly=
    "ServiceInterface, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" 
    xmlns="http://schemas.datacontract.org/2004/07/ServiceInterface" 
    xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/">   
  2. < Id>10< /Id>   
  3. < Name z:Id="2">nine< /Name>   
  4. < /Sub> 

 

发现了吗?撇开xml命名空间不说,Sub元素多了Type,Assembly和Id,Name属性也多了个Id。信息完整多了~~,现在就可以解释两者Constructor的区别了,DataContractSerializer是按照SOA的datacontract协议(与SOAP基本一直)来序列化对象的,它并不包含平台相关的信息,比如类型,程序集等。所以比如在创建序列化器时就提供将要序列化和反系列化的类型信息,DataContractSerializer无法工作。而NetDataContractSerializer则大大扩充了SOAP,为它添加了程序集、类型名等附加信息,这样一来,序列化器可以完全由序列化的内容来准确推断将要构造的对象,而不必依赖Constructor所提供的类型参数了。这就是两者Constructor不同的原因。

以上就是对WCF序列化的相关介绍。

相关内容

热门资讯

PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
范例解读VB.NET获取环境变... VB.NET编程语言的使用范围非常广泛,可以帮助开发人员处理各种程序中的需求,而且还能对移动设备进行...
规避非法攻击 用好路由器远程管... 单位在市区不同位置设立了科技服务点,每一个服务点的员工都通过宽带路由器进行共享上网,和单位网络保持联...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...