Frage

Ich habe eine einfache Art, die eine Schnittstelle explizit implemets.

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

Gibt es eine Möglichkeit zu serialisiert und deserialisiert Objekte vom Typ IMessageHeader ??

Ich habe die folgenden Fehler, wenn versucht,

"Can not Schnittstelle IMessageHeader serialisiert"

War es hilfreich?

Lösung

Sie können nicht IMessageHeader serialisiert werden, weil Sie nicht Activator.CreateInstance tun können (typeof (IMessageHeader)), das ist das, was die Serialisierung unter der Decke tun wird. Sie benötigen einen konkreten Typ.

Sie können typeof (Message) tun oder man könnte sagen, haben eine Instanz von Message und tun

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

Andere Tipps

Nein, weil der Serializer eine konkrete Klasse muss, dass es instanziieren kann.

Bei dem folgenden Code:

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

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

Welche Klasse hat der Serializer erstellen von Deserialize zurückzukehren ()?

In der Theorie ist es möglich, eine Schnittstelle zur Serialisierung / Deserialisierung, nur nicht mit XmlSerializer.

Versuchen IXmlSerializable auf Ihre IMessageHeader Erklärung hinzufügen, obwohl ich glaube nicht, dass funktioniert.

Von dem, was ich mich erinnere, der .net xml Serializer funktioniert nur für konkrete Klassen, die einen Standard-Konstruktor haben.

Das Problem ergibt sich aus der Tatsache, dass Sie nicht über eine Schnittstelle deserialisieren kann, sondern brauchen eine konkrete Klasse instanziiert.

Das XmlInclude Attribut verwendet werden kann, die Serializer zu sagen, welche konkreten Klassen die Schnittstelle implementieren.

Sie können eine abstrakte Basisklasse, die Geräte erstellen IMessageHeader und auch erbt MarshalByRefObject

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top