我使用WCF RIA服务将自定义数据传输对象返回给Silverlight客户端。
我想返回一个对象,比如FruitBasket (类似于这个职位),它包含一个水果列表。果树类是派生类的基类,例如Apple、Pear、Peach等。在运行时,水果列表可以包含任何派生类型。我希望RIA序列化和反序列化整个FruitBasket对象,包括它的成果集合。
键入'Peach‘与数据契约名称'Peach:http://schemas.datacontract.org/2004/07/FruitApp’是不需要的。考虑使用DataContractResolver或将任何类型静态地添加到已知类型列表中,例如,使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中。
[KnownType(typeof(Peach))]属性,我就会得到一个编译时错误:复杂类型的“水果”无效。复杂类型不能指定KnownTypeAttribute。
如何建立数据模型,以便访问客户端上的果树集合?在客户端,如果只将对象识别为“水果”对象,则甚至可以。我只需要他们去反序列化。
发布于 2011-12-23 20:13:23
RIA服务支持两种用户类型:复杂类型和实体类型。实体是一个持久化对象,具有唯一标识它的键。复杂类型就是将几个基本类型字段组合成一个对象。它们不使用类和层次结构的一般概念,它们限制您可以或不能做什么,以便更有效地解决一些特定问题。
其中一个限制是复杂类型不能具有派生类型。很难说为什么,但我认为如果没有限制,框架就会复杂得多。
现在,有几种方法可以解决这个问题:
Fruit类中已经有了适当的键(例如,数据库Id),只需使用[Key]属性标记它。Guid的Guid.NewGuid()属性,用[Key]标记它,就可以了。注意到,在这种情况下,您将无法设置与Fruit实体的任何关系,也无法将更改保存回服务器。选择取决于您,因为这取决于您的需求。
发布于 2011-12-23 18:34:02
显然,WCF将把任何没有KeyAttribute的类视为一个复杂类型,从而引发错误。
因此,如果您的果树基类中有一个可以用作键的属性,那么用[Key]来修饰它应该可以解决复杂类型的错误消息。
https://stackoverflow.com/questions/8618287
复制相似问题