SerializationException when returning custom classes from a WCF service

纵然是瞬间 提交于 2019-12-24 07:53:05

问题


I have the following classes...

public abstract class Fallible<T> {
}

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

  public T Value { get; private set; }
}

The background to this can be found in a previous question of mine, but you don't need to read that post as the classes above are all that's needed to see the problem.

If I have a simplified WCF service call like this...

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

...then when I try to call the service from the WPF app that consumes it (or the WCF test client), I get a CommunicationException exception...

There was an error while trying to serialize parameter :GetPatientResult. The InnerException message was 'Type 'PhysioDiary.Entities.FallibleClasses.Success`1[[PhysioDiary.Entities.Patient, PhysioDiary.Entities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' with data contract name > 'SuccessOfPatient0yGilFAm:http://schemas.datacontract.org/2004/07/PhysioDiary.Entities.FallibleClasses' is not expected. Consider using a DataContractResolver if you are using DataContractSerializer or 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 the serializer.'. Please see InnerException for more details.

...with an inner SerializationException exception of...

Type 'PhysioDiary.Entities.FallibleClasses.Success`1[[PhysioDiary.Entities.Patient, PhysioDiary.Entities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' with data contract name > 'SuccessOfPatient0yGilFAm:http://schemas.datacontract.org/2004/07/PhysioDiary.Entities.FallibleClasses' is not expected. Consider using a DataContractResolver if you are using DataContractSerializer or 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 the serializer.

I've tried adding [DataContract] to the class and [DataMember] to each property, as well as adding a [KnownType] attribute for all four classes involved, and adding a [ServiceKnownType] for each of them on the service contract, but nothing helps.

I've read countless answers to the same question, but have not found anything that works. My services return other custom classes, and they all get serialised without a problem.

Anyone able to explain what the problem is here? Please let me know if I've not supplied enough information.


回答1:


Turns out all I needed to do was decorate the service method with [ServiceKnownType] attributes for the base type, and each derived type...

[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"});
}

Although it's a pain to have to add four attributes to every call, it works. I'd like to know if there is a way to combine them into one attribute, but at least I have a working service now.

Hope this helps someone.



来源:https://stackoverflow.com/questions/41965504/serializationexception-when-returning-custom-classes-from-a-wcf-service

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!