WCF,返回已知类型的列表

时间:2011-06-22 08:24:09

标签: wcf web-services known-types

我有一个名为ConstructionManager的服务器端服务,其中一个操作是GetAll(),它返回一个构造列表。 Construction是一个数据合约,有几种类型继承自ConstructionBuildingsApartments等。)

当我发送公寓列表时一切都很好,所有房产都在他们的位置,但是当我在客户端收到该列表,并在运行时查看收到的对象中的内容时,在非公开成员中,我看到了所有属于继承自Construction的类型的属性,如RoomsFloor,但在结果视图中,它显示所有属性的值都为“0”,而不是他们被送了。

关于数据契约构造,在类的顶部,是继承类的KnownType属性。

知道我使用Web服务软件工厂可能会有所帮助。

抱歉我的英语不好。

First image: Server Side GetAll() method, Floors have value: "2"

Second image: Client Side Non public members of list, value of Floors="2"

Third image: Client Result View of  list, value of Floors="0"

1 个答案:

答案 0 :(得分:2)

如果您看到之前的服务中的对象中填充了属性,则通过网络将其发送到客户端(即在序列化之前),然后看到所收到的对象丢失客户端收到之后的中的值,这意味着它们在序列化过程中丢失了。

关于序列化,您需要记住两件事:

  1. 您需要确保通过网络发送的类标有[DataContract]属性,并且其中的所有属性都标有[DataMember]属性。如果属性不是.NET类型,那么定义(及其中的属性)的类也需要使用这些属性进行标记。

  2. 类继承在序列化中丢失。如果您创建一个类型为“Building”的对象,并且您的WCF服务方法返回一种类型的“Construction”,那么发送给客户端的消息可能无法正确序列化(例如,它是否只能序列化基类型中定义的属性) “施工”?)。我建议你通过让你的服务返回继承类型而不是基类型来测试它,看看它是否解决了这个问题。

  3. 我认为第二点是你问题的最可能原因。如果您提供代码,我可以更详细地帮助您