XMLSerialização em C#
-
09-06-2019 - |
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"
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