【问题标题】:The meaning of DataContractSerializer.MaxItemsInObjectGraph propertyDataContractSerializer.MaxItemsInObjectGraph 属性的含义
【发布时间】:2013-12-10 13:55:58
【问题描述】:

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

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

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

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

但我不明白它的本质。

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

【问题讨论】:

  • 这样就可以在本地打同一个数据集不报错?您确定您的本地配置与生产环境中的配置相同吗?

标签: c# wcf


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    • 1970-01-01
    相关资源
    最近更新 更多