When is it appropriate to use the KnownType attribute?

[KnownType] is needed to tell it about subtypes. The disadvantage of not using it is that the following won’t work:

[DataContract]
class Foo {}

[DataContract]
class Bar : Foo {}

with a method on the WCF interface that returns:

public Foo GetFoo() { return new Bar(); }

Without the attribute, the serializer (especially for mex/proxy-generated types) won’t know about Bar, and it will fail. With the attribute:

[DataContract, KnownType(typeof(Bar))]
class Foo {}

it will work. This only applies to DataContractSerializer – with NetDataContractSerializer you get the type data in a different way.

Leave a Comment