Pregunta

Tengo un tipo simple que implementa explícitamente una interfaz.

public interface IMessageHeader
{
    string FromAddress { get; set; }
    string ToAddress   { get; set; }
}

[Serializable]
public class MessageHeader:IMessageHeader
{
  private string from;
  private string to;

  [XmlAttribute("From")]
  string IMessageHeade.FromAddress
  {
    get { return this.from;}
    set { this.from = value;}
  }

 [XmlAttribute("To")]
 string IMessageHeade.ToAddress
 {
    get { return this.to;}
    set { this.to = value;}
 }
}

¿Existe alguna forma de serializar y deserializar objetos de tipo IMessageHeader?

Recibí el siguiente error cuando lo intenté

"No se puede serializar la interfaz IMessageHeader"

¿Fue útil?

Solución

No puede serializar IMessageHeader porque no puede hacer Activator.CreateInstance(typeof(IMessageHeader)) que es lo que la serialización hará en secreto.Necesitas un tipo concreto.

Puedes hacer typeof(MessageHeader) o podrías decir, tener una instancia de MessageHeader y hacer

XmlSerializer serializer = new XmlSerializer(instance.GetType())

Otros consejos

No, porque el serializador necesita una clase concreta de la que pueda crear una instancia.

Dado el siguiente código:

XmlSerializer ser = new XmlSerializer(typeof(IMessageHeader));

IMessageHeader header = (IMessageHeader)ser.Deserialize(data);

¿Qué clase crea el serializador para regresar de Deserialize()?

En teoría, es posible serializar/deserializar una interfaz, pero no con XmlSerializer.

Intente agregar IXmlSerializable a su declaración de IMessageHeader, aunque no creo que funcione.

Por lo que recuerdo, el serializador xml .net solo funciona para clases concretas que tienen un constructor predeterminado.

El problema surge del hecho de que no se puede deserializar una interfaz pero es necesario crear una instancia de una clase concreta.

El atributo XmlInclude se puede utilizar para indicarle al serializador qué clases concretas implementan la interfaz.

Puede crear una clase base abstracta que implemente IMessageHeader y también herede MarshalByRefObject.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top