Domanda

Ho un tipo semplice che implementa esplicitamente un'interfaccia.

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;}
 }
}

Esiste un modo per serializzare e deserializzare oggetti di tipo IMessageHeader??

Ho ricevuto il seguente errore quando ho provato

"Impossibile serializzare l'interfaccia IMessageHeader"

È stato utile?

Soluzione

Non puoi serializzare IMessageHeader perché non puoi eseguire Activator.CreateInstance(typeof(IMessageHeader)) che è ciò che la serializzazione farà sotto le coperte.Hai bisogno di un tipo concreto.

Puoi fare typeof(MessageHeader) o potresti dire, avere un'istanza di MessageHeader e farlo

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

Altri suggerimenti

No, perché il serializzatore necessita di una classe concreta di cui poter istanziare.

Dato il seguente codice:

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

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

Quale classe crea il serializzatore per restituire da Deserialize()?

In teoria è possibile serializzare/deserializzare un'interfaccia, ma non con XmlSerializer.

Prova ad aggiungere IXmlSerializable alla tua dichiarazione IMessageHeader, anche se non penso che funzionerà.

Da quello che ricordo, il serializzatore .net xml funziona solo per classi concrete che hanno un costruttore predefinito.

Il problema deriva dal fatto che non è possibile deserializzare un'interfaccia ma è necessario istanziare una classe concreta.

L'attributo XmlInclude può essere utilizzato per indicare al serializzatore quali classi concrete implementano l'interfaccia.

Puoi creare una classe base astratta che implementa IMessageHeader ed eredita anche MarshalByRefObject

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top