Gson.toJson(PrinterInfo) 返回空对象

问题描述 投票:0回答:1

我正在尝试使用 Gson(版本 2.9.0)将

android.print.PrinterInfo
对象序列化为 JSON:

val type: Class<*> = data.javaClass
json.beginObject()
json.name(type.name)
json.value(gson.toJson(data, type))
Log.d(TAG, data.toString())
json.endObject()

但结果是一个空对象

{android.print.PrinterInfo: {}}
。日志行清楚地显示该对象已填充,没有空值或类似值(但使用
GsonBuilder()
包含空值、漂亮的打印或其他任何内容都没有任何区别)。没有例外,只是没有预期的结果。

android gson parcelable
1个回答
0
投票

主要问题似乎是您尝试序列化 Android 库中的类,而不使用自定义 Gson 适配器。在这种情况下,Gson 将使用反射来访问类的字段,包括表示实现细节的私有字段。

即使这有效并且您获得了一个非空 JSON 对象,它也会包含该类的内部数据,因此它可能在 Android 版本之间有所不同(甚至可能在不同的 Android 设备之间?)。并且不能保证您可以通过这种方式正确地使用

PrinterInfo
重新创建
Gson.fromJson
对象。您收到的
PrinterInfo
可能处于不一致的状态且无法正常工作。

这里更好的解决方案是为 TypeAdapter

 类(和引用的类)编写一个自定义 Gson 
PrinterInfo
 来执行序列化(和反序列化)。
或者因为
PrinterInfo
实现了
Parcelable
,另一个选择可能是使用其
writeToParcel
方法,而不是将其序列化为 JSON。

将来你还可以使用Gson的

ReflectionAccessFilter
来避免意外依赖Android库类的基于反射的序列化。

© www.soinside.com 2019 - 2024. All rights reserved.