[英]gson serialization and deserialization of an ArrayList<object>
我的设置是这样的:
public enum AnimalType {
CAT(1),
DOG(2);
private final int value;
AnimalType(int value) {
this.value = value;
}
public int value() { return value; }
}
public class Dog {
AnimalType type = AnimalType.DOG;
String name;
int id;
//Other properties. Point is to distinguish it from a Cat object.
}
public class Cat {
AnimalType type = AnimalType.CAT;
String name;
String nickName;
int age;
}
public class Response {
ArrayList<Object> myResponseObject;
}
以下是Response对象的外观示例:
ArrayList<Object> arr = new ArrayList<Object>();
Dog dog = new Dog("MyName",0);
Cat cat = new Cat("MyName","MyNickName",-1);
arr.add("I have a ");
arr.add(cat)
arr.add(" and a ");
arr.add(dog)
Response response = new Response(arr);
我这样序列化:
Gson gson = new Gson();
String serializedOutput = gson.toJson(response);
并希望像这样反序列化:
//the ArrayList<Object> should be populated correctly inside of it?
Response deserializedObject = gson.fromJson(serializedOutput);
但是,在反序列化此列表时,我需要将对象映射回各自的类型。 我怀疑我至少需要标记该类或输入我的狗或猫的序列化。 现在,我在Dog和Cat上添加了一个Type属性(而不是interface)。
没有任何花哨的东西, Cat
和Dog
对象在反序列化时默认被视为LinkedTreeMap<K,V>
。 我必须遍历我的arraylist,检查它是否是LinkedTreeMap的实例,调用“type”键来获取类型,然后将我的对象转换为Dog或Cat。 这一切对我来说似乎有些苛刻,我想知道是否有更优雅的方式来做到这一点。
我应该为我的Cat / Dog对象使用自定义序列化器/反序列化器,还是RuntimeTypeAdapterFactory要走的路? 任何指导将不胜感激。
注意,我也是按照Gson的指示自定义/反序列化我的枚举:如何更改枚举的输出 。 我不确定这是否会影响任何事情。
谢谢
用户指南中对此进行了介绍。 您正在尝试反序列化任意类型的集合
如上所述,您有3个选择:
选项1:使用Gson的解析器API(低级流解析器或DOM解析器JsonParser)来解析数组元素,然后在每个数组元素上使用Gson.fromJson()。这是首选方法。
选项2:为Collection.class注册一个类型适配器,它查看每个数组成员并将它们映射到适当的对象。 这种方法的缺点是它会搞砸Gson中其他集合类型的反序列化。
选项3:为MyCollectionMemberType注册类型适配器并使用fromJson与Collection <MyCollectionMemberType>仅当数组显示为顶级元素或者您可以将包含集合的字段类型更改为Collection <MyCollectionMemberType类型时,此方法才可用>。
在谈论自动反序列化时,这是一个难题。 此外,在您的情况下,选项3是不可能的,因为您正在使用Object
而不是让Dog
和Cat
继承自某些基类(例如Animal
)。
最重要的是......你正在用这些对象做一些非常奇怪的东西,并在其中粘贴String
。 总的来说,如果这是你自己产生的一些反应......我会认真地重新思考你是如何接近这一点的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.