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