Festlegen, welche Eigenschaften zur Laufzeit serialisiert werden

8

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.

    
mayu 14.02.2012, 05:02
quelle

2 Antworten

5

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 :

%Vor%

Das obige ist ein namensbasiertes Muster, das von XmlSerializer und anderen verwendet wird; Es hat einen Zwilling:

%Vor%

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.

    
Marc Gravell 14.02.2012, 07:22
quelle
0

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.

%Vor%

Dann würde Ihre resultierende Klassendefinition wie folgt aussehen:

%Vor%

Sie würden ToSerialize etwa so aussehen:

%Vor%

Wo ShouldSerialize aussehen könnte:

%Vor%

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:

%Vor%

Dies sollte eine Liste der Eigenschaften zurückgeben, die nur von der aktuellen Instanz von car deklariert wurden.

    
M.Babcock 14.02.2012 05:40
quelle

Tags und Links