开发者

how to specify an alias when serializing an enum using Xstream

I am serializing a class that contains an enum as a field, let say :

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

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

the Xstream output of the enum is :

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

and I would like something like:

     <days>
         <day>MONDAY</day>
         <day>TUESDAY</day>
         <day>WEDNESDAY</day>
         开发者_StackOverflow中文版<day>THURSDAY</day>
         <day>FRIDAY</day>
         <day>SATURDAY</day>
         <day>SUNDAY</day>
     </days>

I found @XStreamImplicit(itemFieldName="name") annotattion in the XStream documentation but it is only working for Collections.

Is it possible to do it with annotations or do I need to create a converter?

To obtain the result I described before I've created the following converter:

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

is there any way to get the node name from xstream alias annotation (@XStreamAlias) if I annotated the Enum with it?


I don't think this exists in XStream. You will probably have to write your own converter. You could start from the code of the EnumSetConverter, it should not be very difficult...


The EnumSetConverter isn't good.

If you can use another collection, works fine:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜