邙山之巅 承接网站建设 + 网站推广 + 网站优化 + IDC + 网络广告等业务。

本博客网页模板,经过SEO优化和测试, 保证其 完整性 + 无错性 + 美观性 + 最简性 !
完整性 -头部尾部完整,首页,列表,内容完整.无错性 -整站模板安装即可使用,Js无错误,兼容IE6,IE7,ie8,FF
美观性 -整体协调,美观大方,配色合理.最简性 -采取DIV+CSS布局,整站无垃圾代码,架构合理,减少下载时间,节省带宽

数据契约的定义与数据契约序列化器(1)

时间:2011-12-27 23:31来源: 作者:admin 点击:

5.2.2  数据契约的定义与数据契约序列化器(1)

同服务契约类似,WCF采用了基于特性(Attribute)的数据契约定义方式。基于数据契约的自定义特性主要包含以下两个:DataContractAttribute和DataMemberAttribute,接下来我们将讨论这两个重要的自定义特性。

DataContractAttribute和DataMemberAttribute

WCF通过应用DataContractAttribute特性将其目标类型定义成一个数据契约,下面是DataContractAttribute的定义。从AttributeUsage的定义来看,DataContractAttribute只能用于枚举、类和结构体,而不能用于接口;DataContractAttribute是不可以被继承的,也就是说当一个类型继承了一个应用了DataContractAttribute特性类型,自身也只有显式地应用DataContractAttribute特性才能成为数据契约;一个类型上只能应用唯一一个DataContractAttribute特性。


  1. [AttributeUsage(AttributeTargets.Enum |
    AttributeTargets.Struct   
  2.   AttributeTargets.Class, Inherited 
    falseAllowMultiple false)]  
  3. public sealed class DataContractAttribute Attribute  
  4.      
  5.     public bool       IsReference get; set;     
  6.     public string     Name get; set; }  
  7.     public string     Namespace get; set; }  

DataContractAttribute仅仅包含3个属性成员。其中Name和Namespace表示数据契约的名称和命名空间;IsReference表示在进行序列化的时候是否保持对象现有的引用结构。比如说,一个对象的两个属性同时引用一个对象,那么有两种序列化方式,一种是在序列化后的XML仍然保留这种引用结构,另一种是将两个属性的值序列化成两份独立的具有相同内容的XML。

对于服务契约来说,我们将在一个接口或类上面应用的ServiceContractAttribute定义成服务契约后,并不意味着该接口或类中的每一个方法成员都是服务操作,而是通过OperationContractAttribute显式地将相应的方法定义成服务操作。与之类似,数据契约也采用这种显式声明的机制。对于应用了DataContractAttribute特性的类型,只有应用了DataMemberAttribute特性的字段或属性成员才能成为数据契约的数据成员。DataMemberAttribute特性的定义如下所示。

 


  1. [AttributeUsage(AttributeTargets.Field AttributeTargets.Property,   
  2.   Inherited falseAllowMultiple false)]  
  3. public sealed class DataMemberAttribute Attribute  
  4.      
  5.     public DataMemberAttribute();  
  6.  
  7.     public bool    
  8. EmitDefaultValue get; set; }  
  9.     public bool    
  10. IsRequired get; set; }  
  11.     public string   
  12. Name get; set; }  
  13.     public int       
  14. Order get; set; }  

下面的列表列出了DataMemberAttribute的4个属性所表述的含义。

Name:数据成员的名称,默认为字段或属性的名称。

Order:相应的数据成员在最终序列化的XML中出现的位置,Order值越小越靠前,默认值为 1。

IsRequired:表明属性成员是否是必须的成员,默认值为false,表明该成员是默认的。

EmitDefaultValue:表明在数据成员的值等于默认值的情况下,是否还须要将其序列化到最终的XML中,默认值为true,表示默认值会参与序列化。

注: 数据契约和数据成员只和是否应用了DataContractAttribute和DataMemberAttribute有关,与类型和成员的存取限制修饰符(public、internal、protected、private等)无关。也就是说,应用了DataMemberAttribute的私有字段或属性成员也是数据契约的数据成员。

数据契约序列化器(DataContractSerializer)

在WCF中,数据契约的定义是为序列化和反序列化服务的。WCF采用数据契约序列化器(DataContractSerializer)作为默认的序列化器。在上面一节,介绍了XmlSerializer以及基于XmlSerializer的序列化规则,现在以相同的方式来介绍DataContractSerializer和基于DataContractSerializer采用的序列化规则。先来看看DataContractSerializer的定义。


  1. public sealed class DataContractSerializer 
    XmlObjectSerializer  
  2.     
  3.     //其他成员  
  4.     public DataContractSerializer(Type type);  
  5.     //其他构造函数  
  6.  
  7.     public override object ReadObject(XmlReader reader);  
  8.     public override object ReadObject(XmlDictionaryReader 
    reader, bool   
  9.       verifyObjectName);  
  10.     public override object ReadObject(XmlReader reader, bool   
  11.       verifyObjectName);  
  12.     public override void    WriteObject(XmlWriter writer, 
    object graph);  
  13.  
  14.     public IDataContractSurrogate DataContractSurrogate get; }  
  15.     public bool IgnoreExtensionDataObjecget; }  
  16.     public ReadOnlyCollection<Type> KnownTypes get; }  
  17.     public int MaxItemsInObjectGraph get; }  
  18.     public bool PreserveObjectReferences get; }  

DataContractSerializer定义了一系列的重载的构造函数,我们可以调用它们构建相应的DataContractSerializer对象,通过制定相应的参数控制系列化器的序列化和反序列化行为。在后续的介绍中我们会通过这些相应的构造函数创建DataContractSerializer对象,在这里就不一一介绍了。DataContractSerializer主要通过两个方法进行序列化和反序列化:WriteObject和ReadObject。这里需要着重介绍一下DataContractSerializer的5个重要属性成员。

DataContractSurrogate:这是一个实现了IDataContractSurrogate接口的数据契约代理类的对象。契约代理会参与到DataContractSerializer的序列化、反序列化,以及契约的导入和导出的过程中,实现对象和类型的替换。

IgnoreExtensionDataObject:扩展数据对象(ExtensionDataObject)旨在解决双方数据契约不一致的情况下,在数据传送-回传(Round Trip)过程中造成的数据丢失。

KnownTypes:由于序列化和反序列化依赖于定义在类型的元数据信息,所以在进行序列化或反序列化之前,需要确定被序列化对象,或者反序列化生成对象的所有相关的真实类型。为了确保序列化或反序列化的成功,须要将相关的类型添加到KnownTypes类型集合中。

MaxItemsInObjectGraph:为了避免黑客生成较大数据,频繁地访问服务造成服务器不堪重负(我们一般把这种黑客行为称为拒绝服务DoS-Denial of Service),可以通过MaxItemsInObjectGraph属性设置进行序列化和反序列化允许的最大对象数。MaxItemsInObjectGraph的默认值为65536。

PreserveObjectReferences:这个属性与DataContractAttribute的IsReference属性的含义一样,表示的是如果数据对象的多个属性或字段引用相同的对象,在序列化的时候是否需要在XML中保持一样的引用结构。

(责任编辑:admin)
首页 - 技术交流 - 生活感悟 - 影视音乐 - 网址导航 - 图片收藏 - 实用工具 - 网站地图 - 百度地图 - RSS地图
邙山之巅:软件攻城师,互联网砖家,山水田园诗人,著名的思想家,政治家,文学家。
是中华人民共和国合法公民,在计算机软件方面有较高造诣。著有《放羊的那些事》一书,书中描绘了自己童年时代放羊的美好时光,
告诫人们要保护环境,否则以后只能在上海的南京路上放羊了。同时脑细胞异常活跃,经常胡思乱想,目前正在思考如何解决“欧债危机”和“美债危机”这两个世界级难题。
邙山之巅:从小就饱读诗书,学前班连上五年,破世界吉尼斯纪录,因此基础知识功底非常深厚。7岁能够看懂A片,8岁可以腾云吐雾,9岁号称千杯不倒,10岁已然有了一次轰轰烈烈的恋爱。此时此刻,很多东西对他来说早已是风轻云淡。后来考取了美国法克由大学的全能博士学位,成为华人中获得此高等学位的第一人。
在计算机方面的成就:精通C,C++,C#,JAVA,PHP,ASP,VB,DELPHI,ORACLE,MYSQL等。尤其精通网页前后台,设计,DIV+CSS,PHP+MYSQL,js,以及各种流行CMS。
新公司堆积3个月的活,被其一周干完。曾因技术过强,工作效率过高,而遭人嫉妒。 政治学方面成就:成功收复台湾,维护了台海稳定。
经济学方面的成就:帮助世界各国成功度过经济危机,并且成功预测了后经济危机时代的到来。 文学方面的成就:著《放羊的那些事》,以及10篇评论性文章,均未发表或出版。
Copyright ◎ 2012-2022 lixinwei.cn 邙山之巅 版权所有
豫ICP备17045676号-1 给我写信