在WCF的实体类中使用[Datacontract]属性有什么用处

sub*_*ash 1 wcf datacontracts

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

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

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

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

  1. 那么[DataContract]属性在上述情况下有多重要?
  2. 使用使用[DataContract]attribute 定义的业务实体类和不使用[DataContract]属性有什么区别?

Stu*_*tLC 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; }
}
Run Code Online (Sandbox Code Playgroud)

通过比较,如果你[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; }
}
Run Code Online (Sandbox Code Playgroud)

我猜为什么增加的原因[DataContract],你的情况是作品可能是因为你已经把它添加到根实体,但某处的实体图"产业链",一个或多个复合实体不具备的[DataMember]属性.如果您刚刚打上你的根实体[DataContract]没有[DataMember]当时的只有根实体序列化,从而避免了MaxItemsInGraph设置(但你的客户显然不会接受任何序列化的实体).