DataContractSerializer.MaxItemsInObjectGraph属性的含义

时间:2013-12-10 13:55:59

标签: c# wcf

我们的WCF服务的一种方法会在生产环境中抛出异常:

  

格式化程序在尝试反序列化消息时抛出异常:有一个   尝试反序列化参数http:// our_schema:GetSomeListResult时出错。该   InnerException消息是'可以序列化的最大项目数或   在对象图中反序列化为'65536'。更改对象图或增加   MaxItemsInObjectGraph quota。

方法GetSomeList返回一个对象列表(15个属性 - 整数,枚举,字符串,DateTimes),它有大约6k个元素。但是,相同的服务配置不会在我的本地计算机和测试环境中导致此错误。 我知道如何修复此错误:

    <behavior name="basicEndpointBehavior">
    <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
    </behavior>

但我不明白它的性质。

那么序列化/反序列化数组中的实际对象数是多少? List.Count? List.Count *(属性数量)?如果公式是List.Count *(属性数),则对象数= 6k * 15 = 90k,大于65536.为什么此方法调用在本地使用相同大小的数组工作正常?

1 个答案:

答案 0 :(得分:2)

对象的数量 - 即需要序列化的事物的实例数。如果列表中对象的所有属性只返回一个原始对象,则该数字应为List.Count * (number of properties + 1)(列表中的每个项目都是一个对象,而项目的每个属性都是另一个)。

如果您将EmitDefaultValue设置为false,则该数字可能会显着降低,但您可能没有这样做。

至于为什么本地行为可能与生产不同,我看到串行器配置仅适用于HTTP的情况,你必须为HTTPS单独设置它;这可能是问题吗?