簡體   English   中英

gson序列化和反序列化ArrayList <object>

[英]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)。

沒有任何花哨的東西, CatDog對象在反序列化時默認被視為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而不是讓DogCat繼承自某些基類(例如Animal )。

最重要的是......你正在用這些對象做一些非常奇怪的東西,並在其中粘貼String 總的來說,如果這是你自己產生的一些反應......我會認真地重新思考你是如何接近這一點的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM