In your quest to find out how you can support XML serialization for types that contain interfaces, you may often find yourself coming to the same answer: you cannot serialize interfaces. That is true, but you can work around it, and I will present two methods.
Write you own Xml serialization code
This post provides a nice answer to your woes. But you should watch out for a gotcha:
strType = m_Child.GetType().FullName;
Instead you may want to use this in case your dependant interface implementations could come from an external assembly:
string strType = m_Child.GetType().AssemblyQualifiedName ?? m_Child.GetType().FullName;
Use generics with constraints
You can get away with not having to write your own serialization code by using generics. This isn’t a silver bullet as it will effect your class design, and may not make sense. Take this example:
public class MyClass { public IMyInterface MyProperty { get; set; } }
You could rewrite this to become:
public class MyClass <T> where T : IMyInterface { public T MyProperty { get; set; } }
Of course this has several implications. For example, instantiating these types become more complicated and could lead to tricker wiring/construction problems. Another point to make is the class itself doesn’t guarantee it is XML serializable: if the class is declared with type (T) of an interface (or a non-serializable class) then it won’t be XML serializable. But this should nothing to be surprized about, the .Net frameworks XML serializable generic types also behave like this (e.g. List<T>).
Here is another example:
public class MyCollection { public IList<IMyInterface> MyProperty { get; set; } }
Generic XML serializable version (provided T is XML serializable):
public class MyCollection <T> where T : IMyInterface { public IList<T> MyProperty { get; set; } }
Filed under: Uncategorized
