为什么我不能在WCF类中使用KnownType属性?

时间:2011-03-22 12:15:38

标签: wcf serialization

我正在使用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。

为什么我需要设置为能够使用该属性?

2 个答案:

答案 0 :(得分:6)

默认情况下不会添加包含该类型的相关DLL。您需要添加对以下内容的引用:

System.Runtime.Serialization

用法在文档中描述:

http://msdn.microsoft.com/en-us/library/system.runtime.serialization.knowntypeattribute.aspx

基本上,串行器识别出类型。您的服务合同返回基类的数组,但该数组中的类型可能更多派生。如果没有告诉序列化程序,我认为序列化将失败。

答案 1 :(得分:1)

在没有显式添加对项目的引用的情况下,我能够在代码中使用“我能够使用“ using System.Runtime.Serialization”,但是当我使用“ KnownType”或“ {{ 1}}“编译器给出了错误。

我可以通过显式添加引用来克服此问题。转到项目中的“添加引用”,然后在“程序集”下搜索“ System.Runtime.Serialization”,然后将dll添加到项目中。

可在.net 4.5和4.5.1中使用,因此我认为这也将在4.0中使用。