¿Cómo serializar y deserializar una interfaz usando IXmlSerializer?

Estoy tratando de serializar una interfaz. Sé que esto es imposible a través de la serialización estándar, esa es la razón por la que usé la serialización personalizada en una clase base.

public interface IFoo 
{ 
    object Value { get; } 
} 

public abstract class Foo<T> : IFoo, IXmlSerializable 
{ 
    [XmlElement] 
    public T Value { get; set; } 
    [XmlIgnore] 
    object IFoo.Value { get { return Value; } } 

    XmlSchema IXmlSerializable.GetSchema() { return null; } 
    void IXmlSerializable.ReadXml(XmlReader reader) { throw new NotImplementedException(); } 
    void IXmlSerializable.WriteXml(XmlWriter writer) 
    { 
        XmlSerializer serial = new XmlSerializer(Value.GetType()); 
        serial.Serialize(writer, Value); 
    } 
} 

public class FooA : Foo<string> { } 
public class FooB : Foo<int> { } 
public class FooC : Foo<List<Double>> { } 
public class FooContainer : List<IFoo>, IXmlSerializable 
{ 
    public XmlSchema GetSchema() { return null; } 
    public void ReadXml(XmlReader reader) { throw new NotImplementedException(); }  
    public void WriteXml(XmlWriter writer) 
    { 
        ForEach(x =>  
            { 
                XmlSerializer serial = new XmlSerializer(x.GetType()); 
                serial.Serialize(writer, x); 
            }); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
        FooContainer fooList = new FooContainer() 
        { 
            new FooA() { Value = "String" }, 
            new FooB() { Value = 2 }, 
            new FooC() { Value = new List<double>() {2, 3.4 } }  
        }; 

        XmlSerializer serializer = new XmlSerializer(fooList.GetType(), 
            new Type[] { typeof(FooA), typeof(FooB), typeof(FooC) }); 
        System.IO.TextWriter textWriter = new System.IO.StreamWriter(@"C:\temp\demo.xml"); 
        serializer.Serialize(textWriter, fooList); 
        textWriter.Close(); 
    } 
} 

Mis serializaciones personalizadas no son correctas. Por el momento se está guardando todo el valor de la propiedad, pero para deserializarla no tengo ni idea de cómo hacerlo.

La idea es guardar la propiedad Valor y recuperar el fooContainer con los elementos.

preguntado el 03 de mayo de 12 a las 22:05

1 Respuestas

Un deserializador no solo deserializaría los valores de propiedad, sino también el objeto que los contiene. Ese objeto no puede ser del tipo IMyInterface ya que es una interfaz y no se puede instanciar. Querrá serializar una implementación de esa interfaz y deserializarla, o asignar una implementación predeterminada de la interfaz para deserializarla.

contestado el 03 de mayo de 12 a las 22:05

¿Puedes ayudar a publicar el ejemplo? Todavía no he cumplido. - Zona Darf

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.