【问题标题】:what is the use of [Datacontract] attribute in entity class of WCFWCF实体类中[Datacontract]属性的用途是什么
【发布时间】:2012-08-01 06:34:17
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 在您的实体对象上指定 [DataContract] 属性后,您是否能够从您需要的各种属性中检索所有数据。

标签: wcf datacontracts


【解决方案1】:

通过将[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; }
}

比较起来,如果你在House上指定[DataContract],那么只有[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 设置(但您的客户端显然不会收到任何未序列化的实体)。

【讨论】:

  • 我在类中的所有属性都是公共的。当我使用没有 [Datacontract] 属性的类时,当我尝试检索超过 1000 条类类型的记录时,它会抛出异常。但它可以工作当我检索少于 1000 条记录时。[datcontract] 在检索少于 1000 条记录时扮演什么角色...
  • @subash - 您需要检查所有类,将 [DataContract] 和 [DataMember] 属性应用于您想要序列化的类和属性(因此显示给 WCF 服务的客户端)
猜你喜欢
  • 2014-02-01
  • 2015-04-30
  • 2011-02-04
  • 2013-08-31
  • 1970-01-01
  • 2011-08-20
  • 1970-01-01
  • 2019-08-27
  • 1970-01-01
相关资源
最近更新 更多