什么是WCF中的KnownType

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

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

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

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

Ask*_*ein 7

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

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

<data>
  <SecurityInfo>
    <user type="UserAccount">(some further XML data here)</user>
  </SecurityInfo>
</data>
Run Code Online (Sandbox Code Playgroud)

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

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

<data>
  <SecurityInfo>
    <user type="Admin">(some further XML data here)</user>
  </SecurityInfo>
</data>
Run Code Online (Sandbox Code Playgroud)

[KnownType]属性通知WCF服务"接收此Admin类型是可以的",因为它是等待UserAccount类型的子类.

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