什么是WCF中的KnownType

时间:2014-04-07 14:55:17

标签: c# wcf

我正在学习wcf。所以我遇到一个叫做已知类型的wcf属性。在这里,我得到了一段不明确的代码。

[DataContract]
   public class UserAccount {}

   [DataContract]
   public class Admin : UserAccount {}

   [DataContract]
   public class Guest : UserAccount {}

[DataContract]
  [ServiceKnownType(typeof(Admin))]
  [ServiceKnownType(typeof(Guest))]
  public class SecurityInfo
  {
          [DataMember]
          private UserAccount user;
  }

现在教程说上面的代码工作正常,要么我们将SecurityInfo数据成员设置为Admin或Guest.But,如果没有提供Admin和Guest的KnownTypeAttribute,反序列化引擎将无法识别Admin和Guest类型并将哭泣。

SecurityInfo和admin& amp;之间的关系是什么?客座课? 我真的不明白已知的类型属性在这里做了什么。我不熟悉已知的类型属性,不知道它的作用以及何时使用它。

所以我想请求请让我理解已知的类型属性,结果我可以理解它的用途和它是什么......所以来一个简单的示例代码,我可以理解已知的type属性。感谢

2 个答案:

答案 0 :(得分:7)

(这些是简化的解释,说明了概念,而不是WCF中的技术实现)。

当通过网络发送消息时,例如使用WCF,它被序列化。换句话说(大多数时候),在文本中。说XML。客户端发送到服务器的XML描述了数据及其结构。

<data>
  <SecurityInfo>
    <user type="UserAccount">(some further XML data here)</user>
  </SecurityInfo>
</data>

收到此代码后,WCF API会解析XML并尝试创建您可以在代码中操作的C#对象。这是Securityinfo类的实例,其属性类型为UserAccount。但是它如何知道哪个类可以实现?

显然,<user>节点在其属性中包含类名。但是如果客户端发送了像Admin类这样的衍生实例呢?你会收到这样的东西:

<data>
  <SecurityInfo>
    <user type="Admin">(some further XML data here)</user>
  </SecurityInfo>
</data>

[KnownType]属性通知WCF服务&#34;它没问题&#34;接收此Admin类型,因为它是等待UserAccount类型的子类。

Admin子类具有更多属性(如public string AdminEmail { get;set; })时,这一点尤其重要。此属性也将由客户端发送。 WCF服务器在执行服务器端的解析作业时,会通知此附加属性有效,因为Admin类型是有效的[KnownType]

答案 1 :(得分:0)

在WCF中使用已知类型来警告数据协定序列化程序需要处理的类型,这对于服务协定的外部节点来说并不是很明显。例如,如果您有基本类型(在您的情况下是UserAccount),则序列化程序需要知道UserAccount可能具有的2个实际实际类型:Admin或Guest。根据我的经验,已知类型通常用于多态类型的集合。