[英]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.