2016-12-01 60 views
0

我試圖自己編寫Set序列化程序,HashSet具體。這是因爲這樣的一組枚舉元素的默認輸出是這樣的:序列化集

modifier: { 
    amount: 1 
    criteriaSet: { 
     class: java.util.HashSet //<--- bothers me 
     items: [ 
      NONE     
      ADD 
      MULTIPLY 
     ] 
    } 
} 

所以我想我寫我自己的序列化程序。這就是寫入方法的樣子。

@Override 
public void write(Json json, HashSet object, Class knownType) { 
    json.writeObjectStart(); 
    for (Object o : object) 
    { 
     if (o instanceof Modifier.Criteria) 
      json.writeValue("name", ((Modifier.Criteria) o).name()); 
    } 
    json.writeObjectEnd(); 
} 

這工作,但它需要我的名字命名的領域,因此,輸出是這樣的:

modifier: { 
    amount: 1 
    criteriaSet: { 
     name: NONE 
     name: ADD 
     name: MULTIPLY 
    } 
} 

這工作,但由於默認Set串行不寫字段名(名字:)我也想要那個。只是寫的枚舉名稱會產生錯誤json.writeValue(((Modifier.Criteria) o).name());java.lang.IllegalStateException: Name must be set.

我也第一次嘗試這樣的EnumSet因爲EnumSet可與套Enum更有效的,但我遇到了問題了。我正在尋找一個乾淨的解決方案,將Enum值存儲到Set

回答

2

我想你是說你希望它是一個json數組([..])而不是json對象({...})。在這種情況下,使用writeArrayStart()writeArrayEnd()。另見:https://github.com/libgdx/libgdx/wiki/Reading-and-writing-JSON

+0

偉大的工程。但現在我有問題反序列化它。有趣的是,我重寫的讀取方法甚至沒有被調用。任何想法爲什麼這是? – Madmenyo

+0

我認爲這是因爲json看到一個arraylist,但是這個字段是一個HashSet。但不應該讀取方法先運行並返回正確的類型? '引發:java.lang.IllegalArgumentException:無法設置java.util.Set字段com.buckriderstudio.towercrawler.Creature.Modifier.criteriaSet爲java.util.ArrayList' – Madmenyo

+0

哪個讀取方法?如果你有另一個問題,那麼可能會問另一個問題,包括相關的細節。 – Xoppa