我正在学习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类之间的关系是什么?我真的不明白已知的类型属性在这里做了什么.我不熟悉已知的类型属性,不知道它的作用以及何时使用它.
所以我想请求请让我理解已知的类型属性,结果我可以理解它的用途和它是什么....所以来一个简单的示例代码,我可以理解什么是已知的类型属性.谢谢
(这些是简化的解释,说明了概念,而不是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].
| 归档时间: |
|
| 查看次数: |
6645 次 |
| 最近记录: |