2013-03-18 16 views
13

Ich habe erfolgreich mit GSON begonnen, um eine Hierarchie von Objekten in meiner Android-Anwendung zu serialisieren und zu deserialisieren.Abschluss der Objektkonstruktion nach der GSON-Deserialisierung

Einige der Objekte, die serialisiert werden, haben Mitglieder, die ich als markieren muss (oder alternative GSON-Annotationen verwenden, um zu verhindern, dass sie serialisiert werden), weil sie Verweise auf Objekte sind, die ich nicht als Teil des Ausgangs JSON serialisieren möchte Zeichenfolge. Diese Referenzen beziehen sich auf Objekte, die auf andere Weise getrennt konstruiert werden müssen.

Sobald die Struktur wieder in Java-Objekte de-serialisiert wird, muss ich diese Referenzen irgendwann ausfüllen. Ich könnte dies leicht tun, indem ich eine Reihe von Methoden des Typs setXXX() einsetze, aber bis dahin sind diese Objekte in einem unvollständigen Zustand. Ich frage mich daher, ob es einen robusteren Ansatz dafür gibt.

Ways Ich habe von so weit gedacht:

  • Haben die Objekte eine RuntimeException (oder etwas mehr geeignet) werfen, wenn sie in einem unvollständigen Zustand sind; das heißt, wenn sie aufgefordert werden, etwas zu tun, wenn eine Initialisierungsmethode nicht aufgerufen wurde.

  • Trennen Sie die serialisierbaren Bits in ein separates Datenmodellobjekt. Mit anderen Worten, nehmen Sie das Zeug heraus, das nicht serialisiert werden kann. Erstellen Sie nach der GSON-Deserialisierung meine "echten" Objekte mit diesen Datenobjekten in ihrer Zusammensetzung. Dies scheint die Bequemlichkeit der Verwendung von GSON etwas zu besiegen.

  • Schreiben Sie einen benutzerdefinierten Deserializer für GSON, um die spezielle Erstellung dieser Objekte zu behandeln.

Antwort

5

ich wahrscheinlich den zweiten Ansatz nehmen würde, denn wie ich in der Regel meine Anwendungen entwerfen, alles, was serialisiert werden muss/deserialisiert ist wirklich einfach nur alte Daten oder POJOs wenn Sie es vorziehen. Wenn ich die Serialisierungs-API anpassen/konfigurieren muss, um das zu tun, was ich möchte, tendiere ich dazu, zu vereinfachen, was serialisiert wird, sodass die Serialisierungs-API die zusätzlichen Konfigurationen nicht benötigt.

Also, wenn ich ein komplizierteres Datenmodell habe, von dem Teile nicht serialisiert/deserialisiert werden sollen, dann extrahiere ich daraus ein einfacheres Set von POJOs, als konzeptionell separates Datenmodell, um an der Serialisierung teilzunehmen/Deserialisierung. Dies erfordert in der Tat einen zusätzlichen Schritt, um zwischen den zwei Datenmodellen zu mappen, aber das ist normalerweise auch ziemlich einfach.

Wenn der dritte Ansatz bevorzugt wird, notieren Sie auch the Instance Creator feature, da es einen weiteren nützlichen Haken beim Anpassen des Deserialisierungsprozesses bereitstellen kann.

+0

Vielen Dank. Ich denke, ich sollte diesen zweiten Ansatz wählen, da ein anderes Problem darin besteht, dass meine JSON-Ausgabe momentan sehr eng an die eigentliche Klassenimplementierung gekoppelt ist und ich auch an Versionsverwaltung interessiert bin (es könnte unordentlich werden, wenn JSON-Datei in eine neuere App geladen wird) vesion, in dem sich die Klassenstrukturen geändert haben). Das Zuordnen der Anwendungsklassen zu einer Baumstruktur von 'Modell'-Klassen zum Zweck der Persistenz scheint ein guter Weg zu sein, um all dies zu lösen.Dumme Frage, aber welche Terminologie würden Sie verwenden, um zwischen einer realen Arbeiterklasse und einer Datenmodellklasse zu unterscheiden? – Trevor

+0

Vielleicht ViewModel oder PersistenceModel oder SerializedModel oder JsonModel oder IntegrationModel oder ServiceModel oder etwas anderes. –

8

Check out https://github.com/julman99/gson-fire

Es ist eine Bibliothek, die ich gemacht, dass Gson erstreckt Fällen wie Post-Serialisierung und Post-Deserialisierung

auch zu handhaben hat es viele andere coole Features, die ich im Laufe der Zeit mit Gson gebraucht habe .

Verwandte Themen