从WCF服务返回自定义类时出现SerializationException

时间:2017-01-31 19:03:57

标签: wcf serialization datacontractserializer

我有以下课程......

export const createStory = () => (dispatch) => {
  dispatch({ type: CREATE_STORY, payload: { storyId: uniqueId('new') } });
  return Promise.resolve();
};

此背景可以在previous question of mine中找到,但您无需阅读该帖子,因为上述类只是查看问题所需的全部内容。

如果我有这样简化的WCF服务电话......

public abstract class Fallible<T> {
}

public class Success<T> : Fallible<T> {
  public Success(T value) {
    Value = value;
  }

  public T Value { get; private set; }
}

...然后当我尝试从使用它的WPF应用程序(或WCF测试客户端)调用该服务时,我得到[OperationContract] public Fallible<Patient> GetPatient(int id) { return new Success<Patient>(new Patient {ID = 1,FirstName = "Jim",Surname = "Spriggs"}); } 异常......

  

尝试序列化参数时出错:GetPatientResult。该       InnerException消息是'Type'PhysioDiary.Entities.FallibleClasses.Success`1 [[PhysioDiary.Entities.Patient,       PhysioDiary.Entities,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]]'       数据合同名称&gt; 'SuccessOfPatient0yGilFAm:http://schemas.datacontract.org/2004/07/PhysioDiary.Entities.FallibleClasses'       不是预期的。如果您正在使用,请考虑使用DataContractResolver       DataContractSerializer或将任何静态未知的类型添加到列表中       已知类型 - 例如,通过使用KnownTypeAttribute属性或       将它们添加到传递给序列化程序的已知类型列表中。'请       有关详细信息,请参阅InnerException。

......内部CommunicationException例外......

  

输入'PhysioDiary.Entities.FallibleClasses.Success`1 [[PhysioDiary.Entities.Patient,       PhysioDiary.Entities,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]]'       数据合同名称&gt; 'SuccessOfPatient0yGilFAm:http://schemas.datacontract.org/2004/07/PhysioDiary.Entities.FallibleClasses'       不是预期的。如果您正在使用,请考虑使用DataContractResolver       DataContractSerializer或将任何静态未知的类型添加到列表中       已知类型 - 例如,通过使用KnownTypeAttribute属性       或者将它们添加到传递给序列化程序的已知类型列表中。

我尝试将SerializationException添加到班级,[DataContract]添加到每个媒体资源,并为所涉及的所有四个类添加[DataMember]属性,并添加[KnownType]对于服务合同中的每一个,但没有任何帮助。

我已经阅读了同一个问题的无数答案,但没有发现任何可行的答案。我的服务返回其他自定义类,它们都被序列化而没有问题。

任何人都能解释这里的问题是什么?如果我没有提供足够的信息,请告诉我。

1 个答案:

答案 0 :(得分:0)

原来我需要做的就是用基类型的[ServiceKnownType]属性和每个派生类型来装饰服务方法......

[OperationContract]
[ServiceKnownType(typeof(Fallible<Patient>)]
[ServiceKnownType(typeof(Success<Patient>)]
[ServiceKnownType(typeof(BadIdea<Patient>)]
[ServiceKnownType(typeof(Failure<Patient>)]
public Fallible<Patient> GetPatient(int id) {
  return new Success<Patient>(new Patient {ID = 1,FirstName = "Jim",Surname = "Spriggs"});
}

虽然为每次调用添加四个属性是一件痛苦的事,但它确实有效。我想知道是否有办法将它们组合成一个属性,但至少我现在有一个工作服务。

希望这有助于某人。