Editar Este código debe ilustrar el problema:¿Por qué XmlSerializer serializa clases abstractas pero no interfaces?
[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<AThing> aThings = new List<AThing>(new AThing[] { new AThing1() { Name = "Bob" } });
List<IThing> iThings = new List<IThing>(new IThing[] { new IThing1() { Name = "Bob" } });
public void Test()
{
using (StringWriter sw = new StringWriter())
{
XmlSerializer aSerializer = new XmlSerializer(typeof(List<AThing>));
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<IThing>));
iSerializer.Serialize(sw, iThings);
string text = sw.ToString();
}
}
La primera text
generada por aSerializer
será:
<?xml version="1.0" encoding="utf-16"?>
<ArrayOfAThing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<AThing xsi:type="AThing1">
<Name>Bob</Name>
</AThing>
</ArrayOfAThing>
no veo por qué no puede hacer esto iSerializer
:
<?xml version="1.0" encoding="utf-16"?>
<ArrayOfIThing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<IThing xsi:type="IThing1">
<Name>Bob</Name>
</IThing>
</ArrayOfIThing>
en lugar de lanzar una excepción.
¿Has intentado compilar tu código? No creo que se compile el código anterior. Además, publique el código que usa para serializar. Hará que sea mucho más fácil ilustrar cuál es el problema. –
@JohnSaunders: ver mi actualización, creo que debería estar bastante claro ahora. – Juan
Para el registro, ¿cuál es la excepción completa que recibe? –