How to use DataContract with inheritance? Will code below work?
[DataContract] public class ConsoleData { [DataMember] public String Description { get; set; } } [DataContract] public class SomeData : ConsoleData { [DataMember] public int Volume { get; set; } ......
It is used to get or set the order of serialization and deserialization of a member. ISRequired. It instructs the serialization engine that member must be present while reading or deserializing. Name. It gets or sets the DataMember name.
No, the DataContractAttribute is not required - WCF will infer serialization rules.
Data Member are the fields or properties of your Data Contract class. You must specify [DataMember] attribute on the property or the field of your Data Contract class to identify it as a Data Member. DataContractSerializer will serialize only those members, which are annotated by [DataMemeber] attribute.
If you expect the service to accept and return an inherited type then we use the knowntype attribute.
Yes, that would work.
The DataContractAttribute
has Inherited
set to false, so it is necessary to apply the attribute to both the child class and the parent class (as you have done in the question).
KnownType
attribute if you want to use your data contracts with polymorphism. For example
[ServiceContract] interface MyWcfContract { [OperationContract] HandleData(ConsoleData contractData); }
If you invoked the method like so:
SomeData someData = new SomeData { Description = "Test", Volume = 30 }; // The method is expecting a ConsoleData instance, // I'm passing a SomeData instance instead myWcfProxy.HandleData(someData);
Then the deserializer on the service end will not know that it's an instance of SomeData
, just an instance of ConsoleData
which it was expecting. The way to fix this is to register the SomeData
class as a known type of the ConsoleData
.
[DataContract] [KnownType(typeof(SomeData))] public class ConsoleData { [DataMember] public String Description { get; set; } } [DataContract] public class SomeData : ConsoleData { [DataMember] public int Volume { get; set; } ......
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