How do I define DataContract for abstract classes in WCF?
I have a class "Person" which I communicate successfully using WCF. Now I add a new class "Foo" referenced from Person. All still good. But when I make Foo abstract and define a sub class instead it fails. It fails on the server side with a CommunicationException, but that doesn't really tell me much.
My simplified classes made for testing:
[DataContract] public class Person { public Person() { SomeFoo = new Bar { Id = 7, BaseText = "base", SubText = "sub" }; } [DataMember] public int Id { get; set; } [DataMember] public Foo SomeFoo { get; set; } } [DataContract] public abstract class Foo { [DataMember] public int Id { get; set; } [DataMember] public string BaseText { get; set; } } [DataContract] public class Bar : Foo { [DataMember] public string SubText { get; set; } }
I figured it out. You need to specify the subclasses on the abstract base class using "KnownType". The solution would be to add this on the Foo class:
[DataContract] [KnownType(typeof(Bar))] // <------ added public abstract class Foo { [DataMember] public int Id { get; set; } [DataMember] public string BaseText { get; set; } }
Check out this link.
Interesting.
I would expect that code to fail in the Person
constructor since you can't directly instantiate an Abstract Class.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With