Warum verwendet GSON NUR Felder (privat, öffentlich, geschützt)? Gibt es eine Möglichkeit, GSON anzuweisen, nur Getter und Setter zu verwenden?
Antworten:
Wenn Sie ein Objekt serialisieren / deserialisieren, erhalten Sie im Allgemeinen eine exakte Kopie des Objektstatus. Daher möchten Sie im Allgemeinen die Kapselung umgehen, die normalerweise in einem OO-Design gewünscht wird. Wenn Sie die Kapselung nicht umgehen, ist es möglicherweise nicht möglich, ein Objekt zu erhalten, das nach der Deserialisierung genau den gleichen Status aufweist wie vor der Serialisierung. Betrachten Sie außerdem den Fall, in dem Sie keinen Setter für eine bestimmte Eigenschaft bereitstellen möchten. Wie sollte Serialisierung / Deserialisierung funktionieren, wenn Sie die Getter und Setter durcharbeiten?
transient
damit sie nicht serialisiert und auf Anfrage neu berechnet werden.
Gibt es eine Möglichkeit, GSON anzuweisen, nur Getter und Setter zu verwenden?
Noch nicht.
Aus dem Designdokument :
[T] hier sind gute Argumente, um auch Eigenschaften zu unterstützen. Wir beabsichtigen, Gson in einer späteren Version zu verbessern, um Eigenschaften als alternative Zuordnung zum Anzeigen von Json-Feldern zu unterstützen. Derzeit ist Gson feldbasiert.
Der vage Umriss, wie dies in unserer App funktioniert, ist, dass wir viele TypeAdapter
Implementierungen haben - einige für bestimmte wertähnliche Objekte und einige für Objekte im Bean-Stil, bei denen wir wissen, dass die JavaBeans-Logik funktioniert. Wir jammen dann alle diese auf ein, GsonBuilder
bevor wir das Gson
Objekt erstellen .
Leider ist GSON wirklich beschissen im Umgang mit Typen wie Object[]
. Wir haben dies meistens gesehen, als wir versucht haben, ein JSON-Objekt zur Darstellung von Methodenparametern zu erstellen. Die Problemumgehung bestand darin, benutzerdefinierte TypeAdapter
Instanzen zu erstellen, die die Methoden widerspiegeln. (Dies bedeutet, dass Sie am Ende eine Gson
Instanz pro Methode verwenden, die Sie aufrufen möchten ...)