Por que o XmlSerializer pode serializar classs abstratas, mas não interfaces?

Editar Este código deve ilustrar todo o problema:

[XmlInclude(typeof(AThing1))] public abstract class AThing { public abstract string Name { get; set; } } [XmlInclude(typeof(IThing1))] public interface IThing { string Name { get; set; } } public class AThing1 : AThing { public override string Name { get; set; } } public class IThing1 : IThing { public string Name { get; set; } } List aThings = new List(new AThing[] { new AThing1() { Name = "Bob" } }); List iThings = new List(new IThing[] { new IThing1() { Name = "Bob" } }); public void Test() { using (StringWriter sw = new StringWriter()) { XmlSerializer aSerializer = new XmlSerializer(typeof(List)); aSerializer.Serialize(sw, aThings); string text = sw.ToString(); } using (StringWriter sw = new StringWriter()) { // This line will throw "Cannot serialize interface IThing.": XmlSerializer iSerializer = new XmlSerializer(typeof(List)); iSerializer.Serialize(sw, iThings); string text = sw.ToString(); } } 

O primeiro text gerado pelo aSerializer será:

    Bob   

Eu não vejo por que o iSerializer não pode fazer isso:

    Bob   

em vez de lançar uma exceção.

você pode serializar a interface, mas não tão simples quanto as classs:

http://ventspace.wordpress.com/2010/02/20/how-to-serialize-interfaces-in-net/

mas para responder a sua pergunta eu tenho 2 palpites sobre isso:

A primeira razão é do lado prático; A semântica de serializar uma interface é um pouco embaçada. O que você acha que o serializador deve serializar quando você passa em uma referência de interface? Se você só serializar as propriedades da interface que deseja desserializar, poderá acabar com um object não inicializado pela metade. Não há como dizer o que isso faria com sua aplicação.

Se você serializar o object completo junto com as informações do tipo, a serialização da interface realmente não lhe compraria nada. Você poderia digitar a referência como um tipo de class em primeiro lugar se seu aplicativo realmente se importa com o object que está lá.

O segundo vai com o objective declarado do XmlSerializer. Apesar do nome enganoso Serialization XML no .NET Framework realmente é uma tecnologia de binding de dados com a intenção primária de mapear tipos de dados MXL definidos em esquemas XSD para tipos .NET. A definição XSD conhece classs base abstratas, mas como é cinput em dados, não sabe nada sobre interfaces. Com isso em mente, há pouca motivação para suportar interfaces no XmlSerializer.

O XmlSerializer não está serializando classs abstratas. Está serializando uma das várias classs concretas .