14 Stimmen

Wie serialisiert man eine Schnittstelle wie IList<T>?

Mögliches Duplikat:
Wie serialisiere ich eine IList<T>?

Ich möchte eine Klasse serialisieren (nennen wir sie S ), die eine Eigenschaft vom Typ IList<T> donde T ist eine weitere Klasse, die ich definiert habe. Ich erhalte eine Ausnahme, wenn ich versuche, eine Instanz der Klasse zu serialisieren S zu XML. Dies ist verständlich, da die XmlSerializer weiß nicht, welche konkrete Klasse er verwenden soll. Gibt es eine Möglichkeit, hoffentlich unter Verwendung von Attributen, um anzugeben, welche konkrete Klasse bei der Serialisierung/Deserialisierung einer Instanz instanziiert werden soll. Meine Implementierung der Klasse S erzeugt eine Instanz der List<T> Klasse. Hier ist etwas Code, um mein Beispiel zu illustrieren:

using System;
using System.Xml.Serialization;
using System.IO;

[Serializable]
public class T { }

[Serializable]
public class S
{
    public IList<T> ListOfTs { get; set; }

    public S()
    {
        ListOfTs = new List<T>();
    }
}

public class Program
{
    public void Main()
    {
        S s = new S();
        s.ListOfTs.Add(new T());
        s.ListOfTs.Add(new T());
        XmlSerializer serializer = new XmlSerializer(typeof(S));
        serializer.Serialize(new StringWriter(), s);
    }
}

Ich hoffe, dass es ein Attribut gibt, das ich oberhalb der ListOfTs Definition, die dem Serialisierungsprogramm sagt: "Nimm eine Instanz von List<T> beim Serialisieren/Deserialisieren".

13voto

Azhar Khorasany Punkte 2672

Ändern Sie die

public IList<T> ListOfTs { get; set; }

a

public List<T> ListOfTs { get; set; }

Dann wird es funktionieren.

6 Stimmen

Ich würde dies tun, aber dadurch würde sich die Schnittstelle für die S Klasse. Es ist zwar unwahrscheinlich, dass dies praktische Auswirkungen hat, aber vom Prinzip her würde ich gerne sehen, ob es einen Weg gibt, das Problem zu lösen, ohne den Typ zu ändern.

0 Stimmen

Die vorgeschlagene Lösung funktioniert zwar, kann aber Ihre öffentliche API-Architektur ruinieren

3voto

Jesse Punkte 297

Ich denke, es gibt 2 Möglichkeiten, die im Allgemeinen für diese Art von Problemen genutzt werden.

Eine wäre die Verwendung von DataContractSerializer aber da Sie bereits XmlSerializer verwenden, wollen Sie das wahrscheinlich nicht tun.

Die "Alternative" besteht darin, eine Eigenschaft zu haben, die speziell für den Zweck der Serialisierung verwendet wird, und die IList während der Serialisierung zu ignorieren.

[Serializable]
public class S
{
    IList<T> _listofTs;

    [XmlIgnore]
    public IList<T> ListOfTs { get _listofTs; set _listofTs = value; }

    [XmlElement(Name="Not Exactly the Greatest Solution!")]
    public List<T> ListOfTs { get _listofTs; set _listofTs = value; }

    public S()
    {
        ListOfTs = new List<T>();
    }
}

0 Stimmen

Durch die Verwendung des Attributs XmlIgnore für eine Eigenschaft wird diese vollständig ignoriert. Die Frage ist, ob die Schnittstelleneigenschaft in die Serialisierung aufgenommen werden soll.

0voto

Dmitry S. Punkte 8069

Sie können die IXmlSerializable Schnittstelle und implementieren die Serialisierungslogik manuell mit Xml-Readern und -Writern.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X