WCF - 序列化继承的类型

And*_*rey 15 wcf serialization datacontractserializer

我有这些课程:

[DataContract]
public class ErrorBase {}

[DataContract]
public class FileMissingError: ErrorBase {}

[DataContract]
public class ResponseFileInquiry
{
  [DataMember]
  public List<ErrorBase> errors {get;set;};
}
Run Code Online (Sandbox Code Playgroud)

ResponseFileInquiry类的一个实例是我的服务方法返回给客户端的实例.现在,如果我用ErrorBase实例填充ResponseFileInquiry.errors,一切正常,但如果我添加一个继承类型FileMissingError的实例,我在序列化期间得到一个服务端异常:

Type 'MyNamespace.FileMissingError' with data contract name 'FileMissingError' 
is not expected. Add any types not known statically to the list of known types - 
for example, by using the KnownTypeAttribute attribute or by adding them to the 
list of known types passed to DataContractSerializer.'
Run Code Online (Sandbox Code Playgroud)

因此序列化器变得混乱,因为它期望List包含声明的类型对象(ErrorBase),但它正在获取继承类型(FileMissingError)对象.

我有一大堆错误类型,List将包含它们的组合,那么我该怎么做才能使它工作?

Ars*_*yan 17

您应该将KnownType属性添加到基类

[DataContract]
[KnownType(typeof(FileMissingError))]
public class ErrorBase {}
Run Code Online (Sandbox Code Playgroud)

在此博客中阅读有关KnownType属性的更多信息


And*_*are 7

试试这个:

[DataContract]
[KnownType(typeof(FileMissingError))]
public class ErrorBase {}
Run Code Online (Sandbox Code Playgroud)

正如错误消息所述,任何无法静态知道的信息(如此处表达的多态关系)必须通过属性提供.在这种情况下,您需要指定您的FileMissingError数据协定是其基类的已知类型ErrorBase.

  • 只有在自己手动序列化合同时,才能将已知类型的列表传递给序列化.因为看起来好像你允许WCF为你处理序列化,所以你唯一能做的就是在基类中添加一个`KnownTypeAttribute`,每个子类需要知道一个. (2认同)