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.
Ausgabe:
%Vor%Erwartet:
%Vor%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 :
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
:
Dieser Wrapper ist nicht vorhanden, wenn Sie CollectionTypeAdapterFactory
nicht verwenden, weshalb er in den ersten beiden Beispielen nicht auftritt.
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:
Dann, wenn Sie tun:
%Vor%Sie erhalten die erwartete Ausgabe:
%Vor%