2015-09-07 11 views
8

Wiedziałem, że to pytanie zostało zadane wcześniej. Ze względu na moje początkujące umiejętności w java i android. Nie mogę rozwiązać tego problemu dłużej niż przez tydzień.google gson Klasa LinkedTreeMap odlana do Myclass

Jednym z moich przyjaciół i mojego projektu androida było kilka takich rzeczy.

Najbardziej dziwną częścią tego jest, że dzieje się to tylko wtedy, gdy pobieram i testuję z Google Play Store. Nie z lokalnego instalatora lub trybu debugowania na Androidzie.

Co może być problemem tutaj, lub ta lista zwrotów, która jest całkowicie błędna? Mój przyjaciel przekonuje, że kod ten zwraca się poprawnie, ale z instalacji magazynu gier zawsze jest błąd.

Proszę zasugerować mi, gdzie powinienem dalej kopać?

@Override 
public void promiseMethod(JSONObject object) { 
    if (object != null) { 

     if (object.has(DO_SERVICES)) { 
      vehicleDetails = new ArrayList <Object[]> (1); 
      List <String> vehicleNoList = new ArrayList <String> (1); 
      List <String> serviceList = new ArrayList <String> (1); 
      try { 
       Gson gson = new Gson(); 
       JSONObject jsonObj = new JSONObject(object.get(DO_SERVICES) 
        .toString()); 
       servDto = gson.fromJson(jsonObj.toString(), 
        ServiceDto.class); 


       if (servDto.getServiceDto() instanceof List) { 

        List <DoServiceDto> doServiceList = servDto.getServiceDto(); 

Wyjątek jest

java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap nie mogą być oddane do com.gaurage.dto.DoServiceDto na com.gaurage.user.User_Test_Main .promiseMethod (Unknown Source)

+0

Proszę zasugerować mi, że ktoś potrzebuje więcej kodu –

+0

Dziwny problem przez ponad tydzień i został odrzucony na głosowanie ... Powiedziałem, że jego prace w lokalnej instalacji nie pochodzą z instalacji sklepu zabaw –

+0

Proszę zrozumieć pytanie i kod przed głosowanie w dół. Spójrz na moją zaktualizowaną odpowiedź. –

Odpowiedz

34

szeregowania i deserializacji RODZAJE

Po wywołaniu toJSON (obj), Gson cal ls obj.getClass(), aby uzyskać informacje o polach do serializacji. Podobnie można zazwyczaj przekazać obiekt MyClass.class w metodzie fromJson (json, MyClass.class). Działa to dobrze, jeśli obiekt jest typu nietypowego. Jeśli jednak obiekt jest typu ogólnego, informacja Rodzajowa jest tracona z powodu usunięcia typu Java. Oto przykład ilustrujący punkt:

class Foo<T> { T value;} 
Gson gson = new Gson(); 
Foo<Bar> foo = new Foo<Bar>(); 
gson.toJson(foo); // May not serialize foo.value correctly 
gson.fromJson(json, foo.getClass()); // Fails to deserialize foo.value as Bar 

Powyższy kod nie powiedzie się interpretować jako wartość typu Bar ponieważ Gson wywołuje list.getClass(), aby uzyskać informacje na jego klasy, ale ta metoda zwraca surowe lekcje, Foo.class . Oznacza to, że Gson nie może wiedzieć, że jest to obiekt typu Foo, a nie zwykły Foo.

Możesz rozwiązać ten problem, podając poprawny typ sparametryzowany dla swojego rodzaju. Możesz to zrobić za pomocą klasy TypeToken.

Type fooType = new TypeToken<Foo<Bar>>() {}.getType();  
gson.toJson(foo, fooType); 
gson.fromJson(json, fooType); 

Mam klasy nadrzędnej i jest to klasa potomna, niektóre z nich mają typy listy w nim. Podobnie jak ta klasa nadrzędna mam 30 plików. Rozwiązałem to w ten sposób.

Gson gson = new Gson(); 
JSONObject jsonObj = new JSONObject(object.get(DO_SERVICES).toString()); 
Type type = new TypeToken<MyDto>() {}.getType(); 
servDto = gson.fromJson(jsonObj.toString(),type); 

Najważniejszą rzeczą jest to, że nie można odtworzyć tego błędu w lokalnym testowania z Androidem studio. Ten problem pojawia się tylko wtedy, gdy generuję podpisaną apk i publikuję aplikację w PlayStore, gdy aplikacja jest zatrzymywana, a raport mówi: Nie można przesłać LinkedTreeMap do miksowania.

Trudno było mi odtworzyć ten sam wynik w moich lokalnych testach (w tym trybie debugowania).

+1

który pracował dla mnie, dzięki :) –

+2

odtwarza podczas korzystania z proguard (minifyEnabled true) – Pnemonic

+1

@ Log.d Dzięki, że pracował dla mnie. Minęło 6 godzin, zanim zdałem sobie sprawę z tego problemu i natrafiłem na Twój wpis. –

Powiązane problemy