Question

J'ai un type simple qui implémente explicitement une 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-t-il un moyen de sérialiser et de désérialiser des objets de type IMessageHeader ??

J'ai eu l'erreur suivante lors de l'essai

"Impossible de sérialiser l'interface IMessageHeader"

Était-ce utile?

La solution

Vous ne pouvez pas sérialiser IMessageHeader car vous ne pouvez pas faire Activator.CreateInstance(typeof(IMessageHeader)) ce que la sérialisation va faire sous les couvertures.Vous avez besoin d'un type concret.

Vous pouvez faire typeof(MessageHeader) ou vous pouvez dire avoir une instance de MessageHeader et faire

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

Autres conseils

Non, car le sérialiseur a besoin d’une classe concrète qu’il peut instancier.

Étant donné le code suivant :

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

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

Quelle classe le sérialiseur crée-t-il pour renvoyer Deserialize() ?

En théorie, il est possible de sérialiser/désérialiser une interface, mais pas avec XmlSerializer.

Essayez d'ajouter IXmlSeriallessly à votre déclaration IMessageHeader, même si je ne pense pas que cela fonctionnera.

D'après ce dont je me souviens, le sérialiseur XML .net ne fonctionne que pour les classes concrètes qui ont un constructeur par défaut.

Le problème vient du fait que vous ne pouvez pas désérialiser une interface mais que vous devez instancier une classe concrète.

L'attribut XmlInclude peut être utilisé pour indiquer au sérialiseur quelles classes concrètes implémentent l'interface.

Vous pouvez créer une classe de base abstraite qui implémente IMessageHeader et hérite également de MarshalByRefObject

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top