google gson LinkedTreeMap class cast to myclass

后端 未结 5 808
时光取名叫无心
时光取名叫无心 2020-11-29 05:01

I knew this question has been asked before. Due to my novice skill in java and android. I can\'t resolve this issue for more than a week.

One of my friend and i dev

5条回答
  •  抹茶落季
    2020-11-29 05:56

    Serializing and Deserializing Generic Types

    When you call toJson(obj), Gson calls obj.getClass() to get information on the fields to serialize. Similarly, you can typically pass MyClass.class object in the fromJson(json, MyClass.class) method. This works fine if the object is a non-generic type. However, if the object is of a generic type, then the Generic type information is lost because of Java Type Erasure. Here is an example illustrating the point:

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

    The above code fails to interpret value as type Bar because Gson invokes list.getClass() to get its class information, but this method returns a raw class, Foo.class. This means that Gson has no way of knowing that this is an object of type Foo, and not just plain Foo.

    You can solve this problem by specifying the correct parameterized type for your generic type. You can do this by using the TypeToken class.

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

    I have Parent class and it's child class some of them having List types in it. Like this parent class i have 30 files. I solved it like this.

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

    The most important thing is, I can't reproduce this error in local testing from Android studio. This problem pops up only, When i generate signed apk and publish app into PlayStore were the app stops, and the report says Cannot cast LinkedTreeMap to myclass.

    It was hard for me to reproduce the same result in my local testing (includes Debug mode).

提交回复
热议问题