gson toJson(PrinterInfo)返回空对象

ie3xauqp  于 2023-11-18  发布在  其他
关注(0)|答案(1)|浏览(190)

我尝试使用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()来包含空值,漂亮的打印或其他任何东西都没有任何区别)。没有异常,只是没有预期的结果。

fslejnso

fslejnso1#

主要的问题似乎是你试图序列化一个来自Android库的类,而没有使用自定义的Gson适配器。在这种情况下,Gson将使用反射来访问类的字段,包括表示实现细节的私有字段。
即使这样做成功了,你得到了一个非空的JSON对象,它也会包含类的内部数据,所以它可能在不同的Android版本之间(甚至可能在不同的Android设备之间?)不同。并且不能保证你可以用这种方式正确地重新创建一个PrinterInfo对象。你可能会收到一个不一致的PrinterInfo状态和非功能。
这里一个更好的解决方案是为PrinterInfo类(和引用的类)编写一个定制的Gson TypeAdapter,它执行序列化(和非序列化)。
或者因为PrinterInfo实现了Parcelable,另一种选择可能是使用它的writeToParcel方法,而不是将其序列化为JSON。
将来你也可以使用Gson的ReflectionAccessFilter来避免意外依赖于Android库类的基于反射的序列化。
可以说,这并没有回答 * 为什么 * 你的问题中的JSON对象是空的,但它强调了尝试(隐式地)使用反射来进行第三方类的JSON序列化有其缺点,并且还有其他替代方案。

相关问题