2010-09-29 40 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