google gson LinkedTreeMap-Klasse in myclass umgewandelt

9

Ich wusste, dass diese Frage schon einmal gestellt wurde. Aufgrund meiner Anfängerfähigkeit in Java und Android. Ich kann dieses Problem nicht länger als eine Woche lösen.

Einer meiner Freunde und ich haben ein Android-Projekt entwickelt, bei dem es so ein paar Dinge gibt.

Der seltsamste Teil dieser Dinge ist, dass es nur passiert, wenn ich es vom Google Play Store herunterlade und teste. Nicht von lokalen Android-Studio-Installation oder Debug-Modus.

Was könnte das Problem hier sein, oder diese Rückkehrliste, die total falsch ist? Mein Freund überzeugt, dass dieser Code korrekt zurückgibt, aber von der Installation des Play Stores ist es immer ein Fehler.

Bitte schlagen Sie mir vor, wo sollte ich graben?

%Vor%

Ausnahme ist

  

java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap kann nicht in com.gaurage.dto.DoServiceDto umgewandelt werden     unter com.gaurage.user.User_Test_Main.promiseMethod (Unbekannte Quelle)

    
Log.d 07.09.2015, 19:18
quelle

1 Antwort

36

Generische Typen serialisieren und deserialisieren

Wenn Sie json (obj) aufrufen, ruft Gson obj.getClass () auf, um Informationen über die zu serialisierenden Felder zu erhalten. In ähnlicher Weise können Sie das MyClass.class-Objekt in der fromJson-Methode (json, MyClass.class) übergeben. Dies funktioniert, wenn das Objekt ein nicht-generischer Typ ist. Wenn es sich jedoch um ein generisches Objekt handelt, gehen die generischen Informationen aufgrund von Java Type Erasure verloren. Hier ist ein Beispiel, das den Punkt veranschaulicht:

%Vor%

Der obige Code kann den Wert nicht als Typ Bar interpretieren, da Gson list.getClass () aufruft, um seine Klasseninformationen zu erhalten, aber diese Methode gibt eine rohe Klasse Foo.class zurück. Das bedeutet, dass Gson nicht wissen kann, dass dies ein Objekt vom Typ Foo ist und nicht einfach nur Foo.

Sie können dieses Problem lösen, indem Sie den korrekten parametrisierten Typ für Ihren generischen Typ angeben. Sie können das tun, indem Sie die TypeToken-Klasse verwenden.

%Vor%

Ich habe die Elternklasse und ihre Kindklasse, von denen einige Listentypen enthalten. Wie diese Elternklasse habe ich 30 Dateien. Ich habe es so gelöst.

%Vor%

Das Wichtigste ist, dass ich diesen Fehler in lokalen Tests von Android Studio nicht reproduzieren kann. Dieses Problem taucht nur auf, wenn ich signierte APK erzeuge und eine App in PlayStore veröffentliche, wird die App gestoppt und der Report sagt, dass man LinkedTreeMap nicht in myclass einbinden kann.

Es war schwierig für mich, das gleiche Ergebnis in meinem lokalen Test (einschließlich Debug-Modus) zu reproduzieren.

    
Log.d 10.09.2015, 05:49
quelle

Tags und Links