为啥我不能在我的 WCF 类中使用 KnownType 属性?
Posted
技术标签:
【中文标题】为啥我不能在我的 WCF 类中使用 KnownType 属性?【英文标题】:Why can I not use the KnownType attribute in my WCF class?为什么我不能在我的 WCF 类中使用 KnownType 属性? 【发布时间】:2011-07-20 10:44:21 【问题描述】:我正在使用 WCF 检索对象集合。这些对象都是 ProcedureText 类型,但可能是 SuspensionText 或 ResumptionText 的子类,它们都继承自 ProcedureText。
public class ProcedureText
public class SuspensionText : ProcedureText
public class ResumptionText : ProcedureText
我的 OperationContract 指定一个方法返回一个 ProcedureText 对象的数组:
[OperationContract]
[WebGet(UriTemplate = "procedureTexts")]
ProcedureText[] GetProcedureTexts();
如果我将所有对象都转换为 ProcedureText 但我想保持使用子类型的区别,则此方法有效。我曾希望使用 KnownType 属性来做到这一点,并希望能够通过将其添加到我的 ProcedureText 类来做到这一点:
[System.Runtime.Serialization.KnownType(typeof(SuspensionTextDto))]
[System.Runtime.Serialization.KnownType(typeof(ResumptionTextDto))]
public class ProcedureText
这不起作用,因为编译器无法解析 System.Runtime.Serialization.KnownType。我从文档中知道该属性是 .NET Framework 4 的一部分,但我使用的是 .NET Framework 4,这是我项目的 Target Frameweork。
为什么要设置才能使用属性?
【问题讨论】:
【参考方案1】:默认情况下不添加包含该类型的相关 DLL。您需要添加对以下内容的引用:
System.Runtime.Serialization
用法在文档中有描述:
http://msdn.microsoft.com/en-us/library/system.runtime.serialization.knowntypeattribute.aspx
基本上是为了让序列化程序识别类型。您的服务合同返回一个基类数组,但是该数组中的类型可以派生更多。如果没有告诉序列化程序,我认为序列化将失败。
【讨论】:
非常感谢你,亚当。我不应该犯这么愚蠢的错误——我假设引用了 DLL,因为 Visual Studio 识别了命名空间。【参考方案2】:没有显式添加对项目的引用,我可以在我的代码中使用“我能够使用”using System.Runtime.Serialization
,但是当我使用“KnownType
”或“DataMember
”等属性时,编译器报错了。
我能够通过显式添加引用来解决这个问题。进入项目中的“添加引用”,在Assemblies下搜索“System.Runtime.Serialization”,将dll添加到项目中。
适用于 .net 4.5 和 4.5.1,所以我认为这也适用于 4.0。
【讨论】:
以上是关于为啥我不能在我的 WCF 类中使用 KnownType 属性?的主要内容,如果未能解决你的问题,请参考以下文章
为啥,当我在 WCF 服务中模拟时,当我尝试运行 LINQ to SQL 查询时,我的服务不能加载 System.Transactions?
为啥我不必导入我刚刚制作的类以在我的主类中使用它? (爪哇)