我正在学习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属性。感谢
答案 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。根据我的经验,已知类型通常用于多态类型的集合。