Warum serialisiert Gson den Runtime-Typ in der Liste, nicht den Typ der Kompilierungszeit?

9

Warum scheint Gson die verschachtelte generische Typdeklaration beim Serialisieren zu ignorieren?

Ich versuche, Gson dazu zu bringen, den von mir spezifizierten Typ der Kompilierzeit anstelle des Laufzeittyps der Objekte in der Liste zu verwenden. Ich verwende auch eine abstrakte Oberklasse für A.java , aber das folgende Beispiel hat das gleiche Problem.

%Vor%

Ausgabe:

%Vor%

Erwartet:

%Vor%     
user2517647 01.08.2015, 00:32
quelle

1 Antwort

3

Dies liegt daran, dass Gson standardmäßig Collections serialisiert.

Warum passiert das?

Scrollen Sie nach unten, wenn Sie sich nicht darum kümmern und nur eine Korrektur wünschen.

Gsons Standard CollectionTypeAdapterFactory umschließt seine Elementtyp-Adapter in einem so genannten TypeAdapterRuntimeTypeWrapper . Bei der Auswahl des richtigen Adapters wird die folgenden Prioritäten :

%Vor%

In diesem Fall ist die dritte Voreinstellung ein Adapter für B und die vierte Voreinstellung ist ein Adapter für A. Dies ist bei Verwendung der Standard-Serializer nicht vermeidbar, da keine Bedingung in CollectionTypeAdapterFactory :

%Vor%

Dieser Wrapper ist nicht vorhanden, wenn Sie CollectionTypeAdapterFactory nicht verwenden, weshalb er in den ersten beiden Beispielen nicht auftritt.

tl; dr Okay, wie repariere ich es?

Die einzige Möglichkeit, dieses Problem zu umgehen, besteht darin, einen benutzerdefinierten Serializer zu registrieren. Einen für A zu schreiben, wird in Ihrem Anwendungsfall die Lösung sein:

%Vor%

Dann, wenn Sie tun:

%Vor%

Sie erhalten die erwartete Ausgabe:

%Vor%     
durron597 01.08.2015, 17:32
quelle

Tags und Links