我正在使用.net 4.0和wcf服务.我有业务实体类,没有使用[Datacontract]属性定义.
当我尝试检索少于1000个类型的业务实体类的记录时,它工作正常,但是当我尝试检索超过1000个类型的业务实体类的记录时,它会抛出此异常:
格式化程序在尝试反序列化消息时抛出异常:尝试反序列化参数http://tempuri.org/:Securities时出错 .InnerException消息是'对象图中可以序列化或反序列化的最大项数是'65536'.更改对象图或增加MaxItemsInObjectGraph配额.".有关更多详细信息,请参阅InnerException.
当使用[DataContract]为业务实体类定义的属性时,问题得到了解决.
[DataContract]属性在上述情况下有多重要?[DataContract]attribute 定义的业务实体类和不使用[DataContract]属性有什么区别?通过应用于[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设置(但你的客户显然不会接受任何序列化的实体).