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

Val*_*l M 3 wcf serialization

我正在使用WCF来检索对象的集合.这些对象都是ProcedureText类型,但可以是子类SuspensionText或ResumptionText,它们都继承自ProcedureText.

public class ProcedureText { }
public class SuspensionText : ProcedureText { }
public class ResumptionText : ProcedureText { }
Run Code Online (Sandbox Code Playgroud)

我的OperationContract指定一个返回ProcedureText对象数组的方法:

[OperationContract]
[WebGet(UriTemplate = "procedureTexts")]
ProcedureText[] GetProcedureTexts();
Run Code Online (Sandbox Code Playgroud)

如果我将所有对象强制转换为ProcedureText但我想保留使用子类型的区别,这是有效的.我原本希望使用KnownType属性来执行此操作,并希望能够通过将其添加到我的ProcedureText类来实现:

[System.Runtime.Serialization.KnownType(typeof(SuspensionTextDto))]
[System.Runtime.Serialization.KnownType(typeof(ResumptionTextDto))]
public class ProcedureText { }
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为编译器无法解析System.Runtime.Serialization.KnownType.我从文档中知道该属性是.NET Framework 4的一部分,但我使用的是.NET Framework 4,这是我项目的Target Frameweork.

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

Ada*_*rth 6

默认情况下不添加包含该类型的相关DLL.您需要添加一个引用:

System.Runtime.Serialization

用法在文档中描述:

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

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