我正在使用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。
为什么我需要设置为能够使用该属性?
答案 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中使用。