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).
You would need to use the
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; }
......
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…