栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

更改DataContractSerializer的输出格式

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

更改DataContractSerializer的输出格式

    WCF所支持的序列化格式分为Xml和DataContract两种(以下简称Xml格式和DataContract格式)。个人认为,Xml序列化格式是为了达到协议兼容而保留下来的传统格式。比如通过WCF实现基于xup协议的UI架构时,为了与xup协议保持兼容,在设置WCF属性时,建议采用Xml格式;而DataContract格式则是WCF提供的一种新的序列化格式。默认情况下,WCF采用DataContract格式。如需要在WCF中使用Xml格式,我们所要做的事情非常简单:在服务契约接口以及相应的契约方法上应用XmlSerializerFormatAttribute特性,并在使用svcutil.exe实用工具生成客户端代码时带上/ser:XmlSerializer参数。Xml格式和DataContract格式的优缺点大致如下:

  • Xml格式:序列化方式可以通过XmlRootAttribute、XmlElementAttribute以及XmlAttributeAttribute等特性进行控制,也可以使用XmlAttributeOverrides类对序列化方式进行更深层次的自定义,因此它能很方便地兼容已有的通讯协议,使得应用程序符合一定的通讯标准;其缺点就是速度不及DataContract格式,对于需要序列化的成员,必须是公有成员,而且同时实现getter和setter

  • DataContract格式:速度比Xml格式快,因为它正好缺少Xml格式的优点:无法自定义序列化方式。其优点是,相对Xml格式来讲,它支持更多类型的序列化,而且其成员的受访级别可以是受保护的,甚至是私有的;DataContract格式没有Xml格式中类似XmlElementAttribute等控制序列化方式的特性 

    因此,当你的应用程序无需兼容标准协议,并且你不需要对传输的信息作调试时,建议采用DataContract格式。但也有时候我们既希望保证速度,又希望能够在应用程序里输出response的xml信息以便查错;此时,我们会使用DataContractSerializer类来将获得的response信息序列化成xml。当走到这一步时,你会发现,你获得的xml信息会是下面的样子:

view plaincopy to clipboardprint?

  1. 55b494dc-430d-407e-9c5b-62ff9cc86804StartupApworks UI Experimental Server1.0wndHelloWorldwndComplex  

     其实,我们可以使用XmlWriter和XmlWriterSettings类来自定义xml的输出格式。通过类似下面的代码(注意粗体部分),我们获得了带有缩进效果的xml字符串,增加了xml的可读性。

view plaincopy to clipboardprint?

  1. this.clientProxy.Processed += (sender, e) =>       

  2. {       

  3.     XmlWriterSettings settings = new XmlWriterSettings { Indent = true, Encoding=Encoding.UTF8 };     

  4.   

  5.     settings.IndentChars = "t";       

  6.     DataContractSerializer s = new DataContractSerializer(typeof(ApResponse));       

  7.     MemoryStream ms = new MemoryStream();       

  8.     XmlWriter writer = XmlWriter.Create(ms, settings);       

  9.     s.WriteObject(writer, e.Response);       

  10.     writer.Flush();       

  11.     writer.Close();       

  12.     string xml = Encoding.ASCII.GetString(ms.ToArray());       

  13.     this.DoProcessed(sender, xml);       

  14. };     

输出效果如下:

view plaincopy to clipboardprint?

  1.       

  2.       

  3.     5fab9547-06c3-4fc9-8e20-43eafa3bb74a      

  4.     Startup      

  5.           

  6.         Apworks UI Experimental Server      

  7.         1.0      

  8.           

  9.           

  10.               

  11.             wndHelloWorld      

  12.             wndComplex      

  13.               

  14.           

  15.           

  16.               

  17.               

  18.               

  19.           

  20.           

  21.           

  22.               

  23.           

  24.     

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/231622.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号