簡體   English   中英

使用Xstream序列化枚舉時如何指定別名

[英]how to specify an alias when serializing an enum using Xstream

我正在序列化一個包含枚舉字段的類,可以這樣說:

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

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

枚舉的Xstream輸出為:

 <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>

我在XStream文檔中發現@XStreamImplicit(itemFieldName =“ name”)注釋,但它僅適用於Collections。

是否可以通過注釋來完成它,或者我需要創建一個轉換器?

為了獲得我在創建以下轉換器之前描述的結果:

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;
    }
}

如果我用Enum注釋了Enum,有什么方法可以從xstream別名注釋(@XStreamAlias)獲取節點名稱嗎?

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

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>

暫無
暫無

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

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