我在使用GSON序列化和反序列化我的对象结构时遇到问题。为了描述这个问题,我必须稍微描述一下我的类结构:
我有一个java抽象类,我们将它命名为“A”。还有类“BA”,“CA”,“DA”也是抽象的,它们扩展了类“A”。他们每个人都有自己的构造函数,其中非构造函数是非arg。最后有几个(很多!)类扩展“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”中创建了一个非args构造函数,但没有运气。我已经读过“InstanceCreator”,但看起来我必须为扩展“A”的每个具体类创建一个“InstanceCreator”!对?我不能这样做,因为我有很多(很多!)类,它们将“A”扩展为“BA”,“CA”或“DA”。
你能帮我解决这个问题,我错过了什么吗?如何在不为每种类型添加自定义deserialializastion代码的情况下简单地反序列化(序列化似乎很好)这个复杂的结构?
答案 0 :(得分:3)
事实上,你可能有2个不同的问题。
1)您有多态类型,因此您可能希望将对象序列化为具体类型而不是A. 2)您希望反序列化为不提供arg ctrs的具体类型。
Gson不支持1&amp; 2,有1的扩展但我从未使用它。
也许Genson解决了您的问题,它同时支持1&amp; 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>>() {});
您不需要在序列化期间指定类型,除非您希望输出中只存在父字段。
ex:genson.serialize(getListOfAs(),GenericType&gt;(){})将仅序列化A中的属性,您还可以通过在构建器上设置setUseRuntimeTypeForSerialization(true)来强制genson始终使用运行时类型。
此外,如果您不希望在json表示中泄漏impl详细信息,您可以为您的类型定义别名(builder.addAlias(“someAlias”,SomeClass.class),它们将用于代替完整包+ classname