2010-09-29 43 views
0

我序列化包含枚舉作爲一個字段類枚舉時指定一個別名,讓說:如何採用序列西河

private class DayOfWeekSet { 
    private final EnumSet<DayOfWeek> days; 
} 

public enum DayOfWeek implements Serializable { 
    MONDAY, 
    TUESDAY, 
    WEDNESDAY, 
    THURSDAY, 
    FRIDAY, 
    SATURDAY, 
    SUNDAY; 
} 

枚舉的西河輸出是:

<days> 
     <day enum-type="com.company.model.DayOfWeek">MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY</day> 
</days> 

,我想是這樣的:

 <days> 
     <day>MONDAY</day> 
     <day>TUESDAY</day> 
     <day>WEDNESDAY</day> 
     <day>THURSDAY</day> 
     <day>FRIDAY</day> 
     <day>SATURDAY</day> 
     <day>SUNDAY</day> 
    </days> 

我發現@XStreamImplicit(itemFieldName = 「名稱」)annotattion在XStream文檔,但它僅適用於集合。

是否有可能做到這一點與註釋還是我需要創建一個轉換器?

爲了得到我描述了我創建了以下轉換器之前的結果:

public class XstreamDayOfTheWeekEnumConverter implements Converter { 


    @Override 
    @SuppressWarnings("rawtypes") 
    public boolean canConvert(Class type) { 
     return type.equals(DayOfWeekSet.class); 
    } 

    @Override 
    public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) { 
     DayOfWeekSet set = (DayOfWeekSet) source; 
     for (Iterator<DayOfWeek> iterator = set.getDays().iterator(); iterator.hasNext();) { 
      Enum<DayOfWeek> value = iterator.next(); 
      writer.startNode("day"); 
      writer.setValue(value.name()); 
      writer.endNode(); 
     } 
    } 

    @Override 
    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) { 
     //Not implemented 
     return null; 
    } 
} 

有沒有什麼辦法讓從XStream的別名註釋(@XStreamAlias)節點名稱,如果我註釋的枚舉它?

回答

1

我不認爲這存在於XStream中。您可能必須編寫自己的轉換器。你可以從EnumSetConverter的代碼開始,它應該不是很困難...

+0

我已經創建了一個轉換器和正常工作......我仍然對如何獲得的節點名稱有些疑惑。 – yeforriak 2010-09-29 14:21:47

1

EnumSetConverter不好。

如果你可以使用另外一個集合,做工精細:

public class DayOfWeekSet { 
    private List<DayOfWeek> days = new ArrayList<DayOfWeek>(); 

    DayOfWeekSet() { 
     for (DayOfWeek dow: DayOfWeek.values()) { 
      days.add(dow); 
     } 
    } 

    @XStreamAlias("day") 
    public enum DayOfWeek implements Serializable { 
     MONDAY, 
     TUESDAY, 
     WEDNESDAY, 
     THURSDAY, 
     FRIDAY, 
     SATURDAY, 
     SUNDAY; 
    } 
} 

<DayOfWeekSet> 
    <days> 
    <day>MONDAY</day> 
    <day>TUESDAY</day> 
    <day>WEDNESDAY</day> 
    <day>THURSDAY</day> 
    <day>FRIDAY</day> 
    <day>SATURDAY</day> 
    <day>SUNDAY</day> 
    </days> 
</DayOfWeekSet> 
+0

我明白你的意思了,但我無法修改DayOfWeekSet類。現在實現轉換器是我找到的最佳解決方案。 – yeforriak 2010-10-01 13:39:15