Nehmen wir an, ich müsste ein Objekt einer Klasse Auto in Ebenen z. Intern und Öffentlich. Einige der Eigenschaften auf der öffentlichen Ebene sollten nicht serialisiert werden, da sie intern sind.
In diesem Moment ist die "einfachste" Möglichkeit, dies zu erreichen, die Vererbung:
%Vor%Dann könnte ich
%Vor%Das Ergebnis von ToSerialize () wird von einem Framework übernommen (habe ich nicht Kontrolle über) und serialisiert zu JSON oder XML.
Ich habe die XML-Serialisierungsattribute der Einfachheit halber weggelassen.
Das fühlt sich an wie ein Hack und Hacks bringen dich nur so weit. Gibt es einen besseren Weg (Wege?), Um dies zu erreichen?
Ich denke, es ist mittlerweile klar, aber ich möchte es vermeiden, meine eigenen Serialisierungsmethoden für JSON und XML zu schreiben.
Vielen Dank im Voraus Tymek
== EDIT
Um zu verdeutlichen, möchte ich in der Lage sein, mehrere Ebenen zu serialisieren:
%Vor%und
%Vor%== Gewählter Ansatz
Ich habe die Antwort von Marc Gravell als Antwort markiert, da sie allgemeine Informationen darüber liefert, wie C # und seine Standardkomponenten das unterstützen, wonach ich gefragt habe.
Aber ich denke, der beste Ansatz für mein Problem ist die Verwendung von Proxy-Klassen wie oben gezeigt Lassen Sie die Klasse in diesem mehrstufigen Muster mit den folgenden Methoden serialisieren.
%Vor%Dies ermöglicht es, die Klassen Car0..3 sehr einfach zu halten und nur Eigenschaften zu erhalten und zu verstehen.
Das hängt sehr davon ab, welches Framework für die Serialisierung Sie verwenden. Sie erwähnen xml und json - nun, das erste, was Sie beachten sollten, ist, dass Sie einfach mit dekorieren können:
%Vor%oder
%Vor% auf die XmlSerializer
und JavascriptSerializer
antworten. Wenn Sie die Entscheidung pro Instanz treffen müssen, gibt es die Muster ShouldSerialize*
und *Specified
:
Das obige ist ein namensbasiertes Muster, das von XmlSerializer
und anderen verwendet wird; Es hat einen Zwilling:
Sie müssen nichts tun, um sie zu verkabeln - sie funktionieren automatisch.
Verschiedene Serializer erlauben verschiedene Muster.
Außerdem können Sie manchmal Dinge wie [XmlIgnore]
zur Laufzeit hinzufügen - zum Beispiel über XmlAttributeOverrides
oder das Äquivalent für jeden gegebenen Serializer.
Sie könnten Ihre internen Eigenschaften mit einem benutzerdefinierten Attribut dekorieren, das angibt, dass sie in Ihre Anforderungen einbezogen werden sollen (oder ignoriert werden) und dann in Ihrem ToSerialize
das Attribut überprüfen.
Dann würde Ihre resultierende Klassendefinition wie folgt aussehen:
%Vor% Sie würden ToSerialize
etwa so aussehen:
Wo ShouldSerialize
aussehen könnte:
AKTUALISIEREN
Basierend auf @ Bills Einsicht in die Kommentare. Wenn Sie nur dann öffentliche Attribute serialisieren möchten, wenn level
auf Level.Public
gesetzt ist, können Sie diesen Effekt erzielen, indem Sie die Eigenschaften des Typs mit dem BindingFlags.DeclaredOnly
-Flag widerspiegeln:
Dies sollte eine Liste der Eigenschaften zurückgeben, die nur von der aktuellen Instanz von car
deklariert wurden.
Tags und Links c# serialization