1

我正在使用 .net 4.0 和 wcf 服务。我有未使用[Datacontract]属性定义的业务实体类。

当我尝试检索少于 1000 条业务实体类类型的记录时,它可以正常工作,但是当我尝试检索超过 1000 条业务实体类类型的记录时,它会抛出此异常:

格式化程序在尝试反序列化消息时抛出异常:尝试反序列化参数 http://tempuri.org/:Securities时出错。InnerException 消息是“对象图中可以序列化或反序列化的最大项目数为“65536”。更改对象图或增加 MaxItemsInObjectGraph 配额。'。有关更多详细信息,请参阅 InnerException。

当使用[DataContract]为业务实体类定义的属性时,问题得到了解决。

  1. 那么[DataContract]属性在上述情况下起什么作用呢?
  2. [DataContract]使用有属性和没有属性定义的业务实体类有什么区别[DataContract]
4

1 回答 1

7

通过应用[DataContract]到一个类,您告诉 WCF 您将明确声明哪些属性将由DataContractSerializer序列化。

默认情况下,如果没有[DataContract],DCS 将序列化所有公共属性,例如,如果您序列化 House 的实例,Window 和 Door 也将被完全序列化。

public class Window
{
  public string Colour {get; set;}
  public bool IsClean {get; set; }
}


public class Door
{
  public string Colour {get; set;}
  public bool IsOpen {get; set; }
}


public class House
{
  public Door Door {get; set;}
  public Window Window {get; set; }
}

通过比较,如果您[DataContract]在 House 上指定,则只有具有该[DataMember]属性的成员将被序列化,即在下面的情况下,只有 House 的 Address 属性将被序列化:

[DataContract]
public class House
{
  [DataMember]
  public string Address {get; set;}

  // Omitted DataMember!
  public Door Door {get; set;}
  public Window Window {get; set; }
}

我猜测[DataContract]在您的情况下添加有效的原因可能是因为您已将其添加到根实体,但是在实体图“链”的某个位置,一个或多个复合实体没有该[DataMember]属性。如果您刚刚将根实体标记为[DataContract]没有[DataMember]s,那么只有根实体被序列化,从而避免了MaxItemsInGraph设置(但您的客户端显然不会收到任何未序列化的实体)。

于 2012-08-01T06:44:53.280 回答