序列化和反序列化泛型类型
当您调用 toJson(obj) 时,Gson 会调用 obj.getClass() 来获取要序列化的字段的信息。同样,您通常可以在 fromJson(json, MyClass.class) 方法中传递 MyClass.class 对象。如果对象是非泛型类型,则此方法可以正常工作。但是,如果对象是泛型类型,则泛型类型信息会因为 Java 类型擦除而丢失。这是一个说明这一点的例子:
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
上面的代码无法将 value 解释为 Bar 类型,因为 Gson 调用 list.getClass() 来获取其类信息,但此方法返回一个原始类 Foo.class。这意味着 Gson 无法知道这是一个 Foo 类型的对象,而不仅仅是普通的 Foo。
您可以通过为泛型类型指定正确的参数化类型来解决此问题。您可以使用 TypeToken 类来完成此操作。
Type fooType = new TypeToken<Foo<Bar>>() {}.getType();
gson.toJson(foo, fooType);
gson.fromJson(json, fooType);
我有父类,它是子类,其中一些具有列表类型。像这个父类一样,我有 30 个文件。我是这样解决的。
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);
最重要的是,我无法在 Android studio 的本地测试中重现这个错误。仅当我生成签名的 apk 并将应用程序发布到 PlayStore 时,应用程序停止,并且报告显示无法将 LinkedTreeMap 转换为 myclass,才会弹出此问题。
我很难在本地测试(包括调试模式)中重现相同的结果。