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

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

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

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

通过MaxItemsInObjectGraph限定序列化对象的数量

拒绝服务(DoS- Denial of Service)是一种常用的黑客攻击行为,黑客通过生成大容量的数据频繁地对服务器发送请求,最终导致服务器不堪重负而崩溃。对于WCF的序列化或反序列化来说,数据的容量越大、成员越多、层次越深,序列化的时间就越长,耗用的资源就越多,如果黑客频繁地发送一个海量的数组过来,那么服务就会因为忙于进行反序列化的工作而没有足够的资源处理正常的请求,从而导致瘫痪。

在这种情况下,可以通过MaxItemsInObjectGraph这个属性设置DataContractSerializer允许被序列化或反序列化对象的数量上限,一旦超过设定的这个上限,序列化或反序列化的工作将会立即中止,从而在一定程度上解决了通过发送大集合数据形式的拒绝服务攻击。DataContractSerializer中定义了以下3个重载的构造函数使我们能够设定MaxItemsInObjectGraph属性。


  1. public sealed class DataContractSerializer :
    XmlObjectSerializer  
  2. {  
  3.     //其他成员  
  4.     public DataContractSerializer(Type type, 
    IEnumerable
    <Type> knownTypes,   
  5.       int maxItemsInObjectGraph, bool 
    ignoreExtensionDataObject, bool   
  6.       preserveObjectReferencesIDataContractSurrogate 
    dataContractSurrogate);  
  7.  
  8.     public DataContractSerializer(Type type, string 
    rootName, string   
  9.       rootNamespace, IEnumerable<Type> knownTypes,
    int maxItemsInObjectGraph,   
  10.       bool ignoreExtensionDataObject, bool 
    preserveObjectReferences  
  11.       IDataContractSurrogate dataContractSurrogate);  
  12.  
  13.     public DataContractSerializer(Type type, 
    XmlDictionaryString rootName,   
  14.       XmlDictionaryString rootNamespace, 
    IEnumerable
    <Type> knownTypes, int   
  15.       maxItemsInObjectGraph, bool 
    ignoreExtensionDataObject, bool   
  16.       preserveObjectReferencesIDataContractSurrogate
    dataContractSurrogate);  
  17.       
  18.     public int MaxItemsInObjectGraph get; }  

那么DataContractSerializer在进行具体的序列化时,对象的个数如何计算呢?经过我的实验,发现采用的计算规则是这样的:对象自身算一个对象,所有成员及所有内嵌的成员都算一个对象。我们通过一个具体的例子来证实这一点,在上面定义的泛型Serialize方法上加另一个参数maxItemsInObjectGraph,并调用另一个构造函数来创建DataContractSerializer对象。


  1. public static void Serialize<T>(T instance, 
    string fileName, int   
  2.   maxItemsInObjectGraph)  
  3. {  
  4.     DataContractSerializer serializer 
    new DataContractSerializer(typeof(T),   
  5.       null,maxItemsInObjectGraph,false,false,null);  
  6.     using (XmlWriter writer new 
    XmlTextWriter(fileName, Encoding.UTF8))  
  7.     {  
  8.         serializer.WriteObject(writer, instance);  
  9.     }  
  10.     Process.Start(fileName);  

我们现在准备调用上面的方法对一个集合对象进行序列化,为此定义了一个OrderCollection的类型,它直接继承了List<Order>。


  1. public class OrderCollection List<Order> 
  2. }  
  3.  
  4. [DataContract]  
  5. public class Order  
  6. {  
  7.     [DataMember]  
  8.     public Guid ID  
  9.     get; set; }  
  10.  
  11.     [DataMember]  
  12.     public DateTime Date  
  13.     get; set; }  
  14.  
  15.     [DataMember]  
  16.     public string Customer  
  17.     get; set; }  
  18.  
  19.     [DataMember]  
  20.     public string ShipAddress  
  21.     get; set; }  

在下面的代码中,创建了OrderCollection对象,并添加了10个Order对象,如果该对象被序列化,最终被序列化对象数量是多少呢?应该这样来算,OrderCollection对象本身算一个,每一个Order对象自身也算一个,Order对象具有4个属性,各算一个,那么最终计算出来的个数是10×5+1=51个。但是在调用Serialize方法的时候,指定的上限仅仅是10×5=50。所以当调用DataContractSerializer的WriteObject方法时,会抛出如图5-2所示的SerializationException异常。如果maxItemsInObjectGraph设为51则一切正常。


  1. OrderCollection orders new OrderCollection();  
  2. for (int i 0< 10i++)  
  3. {  
  4.     Order order new Order()  
  5.     {  
  6.         ID Guid.NewGuid(),  
  7.         Date DateTime.Today,  
  8.         Customer "NCS",  
  9.         ShipAddress "#328, Airport Rd, 
    Industrial Park, Suzhou JiangSu   
  10.           Province",  
  11.     };  
  12.     orders.Add(order);  
  13. }  
  14. Serialize(orders, @"E:\order.xml", 10*5); 
(责任编辑: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 给我写信