【问题标题】: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。

为什么要设置才能使用属性?

【问题讨论】:

    标签: wcf serialization


    【解决方案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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 2012-02-10
      相关资源
      最近更新 更多