- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在使用 GSON 序列化和反序列化我的对象结构时遇到问题。为了描述这个问题,我必须稍微描述一下我的类结构:
我有一个 java 抽象类,我们将其命名为“A”。还有类“BA”、“CA”、“DA”也是抽象的,它们扩展了类“A”。他们每个人都有自己的构造函数,没有一个是非参数的。最后有几个(很多!)扩展“BC”或“CA”或“DA”的类。这些“底层”类的实例保存在“ArrayList”列表中。
现在,我正在尝试“jsonize”那个数组列表。为了创建 Json 字符串,我使用了这段代码:
Gson gs = new Gson();
Type listOfTestObject = new TypeToken<List<A>>(){}.getType();
String rez = gs.toJson(getListOfAs(), listOfTestObject);
我正在尝试使用这个(在另一个类中)反序列化该 json:
Type listOfTestObject = new TypeToken<ArrayList<A>>(){}.getType();
ArrayList<A> listOfAs = gs.fromJson(jsonREZString, listOfTestObject);
但是上面的代码抛出这个:
Unable to invoke no-args constructor for class packagename.A. Register an InstanceCreator with Gson for this type may fix this problem.
现在,我已经在类“A”中创建了一个非参数构造函数,但没有成功。我读过“InstanceCreator”,但看起来我必须为每个扩展“A”的具体类创建一个“InstanceCreator”!正确的?我做不到,因为我有很多(很多!)通过“BA”、“CA”或“DA”扩展“A”的类。
我错过了什么?我怎样才能简单地反序列化(序列化看起来很好)这个复杂的结构而不为每种类型添加自定义反序列化代码?
最佳答案
事实上,您可能会遇到 2 个不同的问题。
1) 你有多态类型,因此你可能想将对象序列化为它们的具体类型而不是 A。2) 您想反序列化为不提供无参数 ctrs 的具体类型。
Gson 不支持 1 和 2,有 1 的扩展,但我没用过。
也许 Genson解决了您的问题,它同时支持 1 和 2。
Genson genson = new Genson.Builder()
// enables polymorphic types support
.setWithClassMetadata(true)
// enables no arg support
.setWithDebugInfoPropertyNameResolver(true)
.create();
// will look like: [{"@class": "com.xxx.SomeConcreteClass", ...}, {"@class": "com.XXX.OtherClass"}]
String json = genson.serialize(getListOfAs());
List<A> listOfA = genson.deserialize(json, new GenericType<List<A>>() {});
您不需要在序列化期间指定类型,除非您希望只有父字段出现在输出中。
例如:genson.serialize(getListOfAs(), GenericType>() {}) 将仅序列化来自 A 的属性,您还可以通过在构建器上设置 setUseRuntimeTypeForSerialization(true) 强制 genson 始终使用运行时类型。
此外,如果您不希望 impl 细节在 json 表示中泄漏,您可以为您的类型定义别名 (builder.addAlias("someAlias", SomeClass.class),它们将被使用而不是完整的包+类名.
关于java - 使用 GSON 将复杂对象(反)序列化为 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16915788/
出于好奇,我尝试了一些原型(prototype)制作,但似乎只允许在第一个位置使用子例程的原型(prototype) &。 当我写作时 sub test (&$$) { do_somethin
我需要开发一个类似于 Android Play 商店应用程序或类似 this app 的应用程序.我阅读了很多教程,发现几乎每个教程都有与 this one 类似的例子。 . 我已经开始使用我的应用程
考虑一个表示“事件之间的时间”的列: (5, 40, 3, 6, 0, 9, 0, 4, 5, 18, 2, 4, 3, 2) 我想将这些分组到 30 个桶中,但桶会重置。期望的结果: (0, 1,
我是一名优秀的程序员,十分优秀!