Pergunta

Eu tenho um tipo simples que implementa explicitamente uma interface.

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 uma maneira de serializar e desserializar objetos do tipo IMessageHeader?

Recebi o seguinte erro quando tentei

"Não é possível serializar a interface IMessageHeader"

Foi útil?

Solução

Você não pode serializar IMessageHeader porque não pode fazer Activator.CreateInstance(typeof(IMessageHeader)) que é o que a serialização fará nos bastidores.Você precisa de um tipo concreto.

Você pode fazer typeof(MessageHeader) ou você poderia dizer, ter uma instância de MessageHeader e fazer

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

Outras dicas

Não, porque o serializador precisa de uma classe concreta que possa instanciar.

Dado o seguinte código:

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

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

Qual classe o serializador cria para retornar de Deserialize()?

Em teoria, é possível serializar/desserializar uma interface, mas não com XmlSerializer.

Tente adicionar IXmlSerializable à sua declaração IMessageHeader, embora eu não ache que isso funcionará.

Pelo que me lembro, o serializador xml .net funciona apenas para classes concretas que possuem um construtor padrão.

O problema decorre do fato de que você não pode desserializar uma interface, mas precisa instanciar uma classe concreta.

O atributo XmlInclude pode ser usado para informar ao serializador quais classes concretas implementam a interface.

Você pode criar uma classe base abstrata que implementa IMessageHeader e também herda MarshalByRefObject

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top