Frage

Ich habe eine ziemlich umfangreiche Objektgraphen, die ich über die DataContractSerializer in eine Datei serialisiert haben. Ich möchte nun eine Liste dieser Dateien für den Benutzer zur Auswahl präsentieren. In dieser Liste möchte ich einige Details über die Datei anzuzeigen, die Eigenschaften des Stammobjekts sind. Ich will nicht das ganze Diagramm in dem Speicher laden, da ich bei der Anzeige von Eigenschaften des Root-Knotens nur interessiert bin.

Kennt jemand eine Möglichkeit, die „Tiefe“ der Deserialisierung zu steuern, so dass ich nur das Root-Objekt aus der Datei ziehen und die Kinder überspringen? Ich würde lieber vermeiden, dass die Datei als XML-Rohdaten zu behandeln, da ich keine rohen XML-Manipulationen anderswo zu tun, und dass ein weiterer Zweig des Code wäre, dass ich synchron zu halten habe.

Meine einzige Idee gerade jetzt ist ein kompatibles „Zusammenfassung“ Objekt zu erstellen, nur die Eigenschaften enthält, die mich interessieren, und keines der Kinder, und deserialisieren die Datei in das. Dies sollte die Kinder überspringen, da sie nicht relevant für die Zusammenfassung Objekt sind.

Gibt es einen besseren Weg, dies zu erreichen?

Update / Klarstellung : Attribute sind nicht die Antwort, die ich suche. Für eine Sache, werden sie die „extra“ Objekte landen in der Datei verhindert, wenn das Objekt zuerst serialisiert.

Zweitens sind sie dauerhaftere als das, was ich zu tun bin versucht. Schließlich möchte ich die gesamte Datei deserialisieren, nur nicht an dieser Stelle. Ich versuche, eine zusammenfassende Liste von Dateien angezeigt, die der Benutzer für die Einfuhr wählen werden. Während des Imports, werde ich alle Kinder und Enkel müssen. Es ist nur so viel des Guten bei Schritt 1 Diese sind potentiell große Dateien, so voll Deserialisieren mehrere von ihnen nur so kann ich ihre Header-Informationen angezeigt wird, wird nicht funktionieren.

Hoffentlich keine Verwirrung über die ursprüngliche Frage aufräumt.

War es hilfreich?

Lösung

Das ist so ziemlich so, wie Sie es tun wollen. Die DataContractSerializer sollten mit dieser Situation umgehen, in dem Sie auf Typen, die vom Konzept her gleich sind, aber unterschiedliche Typen von der CLR-Sicht, die Sie ineinander serialisiert werden sollen.

Da nur das Objekt mit dem ähnlichen Teilmenge von Eigenschaften erstellen, die Sie serialisieren möchten und diese Art an die DataContractSerializer passieren.

Vergewissern Sie sich, dass auf der „Zusammenfassung“ Typ, den Sie die Eigenschaften des Datacontract-Attribut (sowie jede Datamember Attribute oder Datacontract-Attribute für Kinder, die Sie belichten), insbesondere den Namen und Namespace-Eigenschaften den Namen zu reflektieren und Namensraum die nicht-Zusammenfassung Typ (da diese müssen zusammenpassen).

Andere Tipps

Meine erste Empfehlung wäre, die XML-Manipulation zu tun, wenn Sie nur ein paar Details aus dem Wurzelknoten ziehen mögen. Eine weitere Möglichkeit, obwohl ich die Performace Auswirkungen nicht kennt, ist es, die Versionierungsfunktionen von DataContractSerializer für dieses Problem zu verwenden. Auf dem Datenvertrag, markieren Sie alle Felder außer denen, die Sie in der Zusammenfassung als Optional benötigen. Kopieren Sie dann den Datenvertrag als eine andere Klasse, die optionalen Felder auslassen. Deserialize auf den neuen, kleineren Datenvertrag.

class Program
{
    static void Main(string[] args)
    {
        Person a = new Person();
        Person b = new Person();
        a.Name = "Mike";
        b.Name = "Joe";
        b.Parent = a;

        DataContractSerializer dtc = new DataContractSerializer(typeof(Person));

        StringBuilder sb = new StringBuilder();
        using (XmlWriter xr = XmlWriter.Create(sb))
        {
            dtc.WriteObject(xr, b);
        }

        object n;

        DataContractSerializer dtc2 = new DataContractSerializer(typeof(TinyPerson));

        using (XmlReader xr = XmlReader.Create(new StringReader(sb.ToString())))
        {
            n = dtc2.ReadObject(xr);
        }

    }
}

[DataContract(Name="Person")]
public class Person
{
    [DataMember]
    public string Name;

    [DataMember(IsRequired=false)]
    public Person Parent; 
}


[DataContract(Name = "Person")]
public class TinyPerson
{
    [DataMember]
    public string Name;

}

Sie können Ihre Serialisierung steuern, indem Attribute verwenden. mehr lesen hier

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