可以在对象图中序列化或反序列化的最大项目数......使用 knowtypes

Posted

技术标签:

【中文标题】可以在对象图中序列化或反序列化的最大项目数......使用 knowtypes【英文标题】:Maximum number of items that can be serialized or deserialized in an object graph... with knowtypes 【发布时间】:2012-02-29 18:16:00 【问题描述】:

在 WCF 4.0 服务中,我们在通用列表中接收大量数据。此列表对象图大于 65536 默认限制。我们已经习惯了,所以我们已经配置了能够获取这些大图的服务。

<serviceBehaviors>
    <behavior>
      <dataContractSerializer maxItemsInObjectGraph="2147483647" />
    </behavior>
  </serviceBehaviors>

使用上面的 xml 配置块,我们在过去没有问题地避免了这个问题,但现在它不起作用了。唯一的区别是,我们在这里尝试在 WCF 方法中反序列化的巨大列表元素中使用 KnownTypes

也许,我是否缺少一些已知类型的特殊配置?

【问题讨论】:

你确定它是 MaxItemsInObjectGraph 被超过,而不是 MaxReceivedMessageSize? 例外是明确的'对象图中可以序列化或反序列化的最大项目数是'65535':( 您的服务是否声明了 behaviorConfiguration 属性?如果是这样,它不会选择上面的默认值 在我的测试和其他服务中确实如此,但我会尝试定义所有内容。 您在上面显示的行为块未命名 - 在 .NET 4 中,这将作为任何未明确声明行为配置的服务的默认值。如果您的服务这样做(例如,公开元数据),那么对 maxItemsInObjectGraph 的更改将不会被拾取 【参考方案1】:

不要忘记检查客户端配置。

在How to fix MaxItemsInObjectGraph error?中查看类似答案

您需要设置 MaxItemsInObjectGraph dataContractSerializer 使用客户端和客户端上的行为 服务。

和maxItemsInObjectGraph ignored

我忘记将此设置放在我的客户端 app.config 文件中

.

【讨论】:

【参考方案2】:

参考http://wcf.codeplex.com/discussions/258278,在类定义中加入如下ServiceBehavior属性,如下:

[ServiceContract]
[ServiceBehavior(MaxItemsInObjectGraph = int.MaxValue)]
public class MaintenanceResource

【讨论】:

在生产中建议指定实际期望值,而不是MaxValue,配置文件是一个灵活的选项,但属性不灵活。【参考方案3】:

正如迈克尔所说,我需要在我的客户端上添加这样的行为(在我网站的 web.config 中):

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

...

<client>
    <endpoint address="..." behaviorConfiguration="deepGraph" ... />
</client>

【讨论】:

以上是关于可以在对象图中序列化或反序列化的最大项目数......使用 knowtypes的主要内容,如果未能解决你的问题,请参考以下文章

可以在对象图中序列化或反序列化的最大项目数......使用 knowtypes

以编程方式设置 MaxItemsInObjectGraph

如何实现一个优雅的Python的Json序列化库

使用 System.Text.Json 使用动态键查询或反序列化 json

使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错

序列化和json