XStream useAttribute不起作用

时间:2014-02-14 12:07:45

标签: java xstream

XStream拒绝在下面的输出xml中添加“resultState”字段作为属性(参见屏幕截图),但它正确地为“order”和“name”字段做了正确的事。知道为什么吗?

代码:

xstream.useAttributeFor(Result.class, "name");
xstream.useAttributeFor(Result.class, "order");
xstream.useAttributeFor(Result.class, "resultState");

使用: - Result.class,下面的xml输出中显示的ScenarioResult,TestCaseResult,PhaseResult和TaskResult的父类。   - “resultState”,Result.class的字段和ResultState类型(它是枚举类型)

XML输出(请参阅作为普通xml文本附带的屏幕截图在帖子上没有正确显示): enter image description here

1 个答案:

答案 0 :(得分:2)

问题是ResultState类是一个枚举类型,并且Xstream不知道如何在没有一点帮助的情况下将枚举作为属性传递。解决方案是为枚举创建一个转换器类,并将其注册到xstream实例,如本文所述: Serialization problem with Enums at Android

请查看此帖子,了解使用泛型的转换器实现: enums as attributes

我的解决方案结合了这两个帖子中的位,如下所示(注意我将转换器设为私有静态,但如果放入自己的类文件,它的工作原理相同):

private static class EnumSingleValueConverter<T extends Enum<T>> 
   extends AbstractSingleValueConverter { 

    private Class<T> enumType; 

    public static <V extends Enum<V>> SingleValueConverter 
    create(Class<V> enumClass) { 
        return new EnumSingleValueConverter<V>(enumClass); 
    } 

    private EnumSingleValueConverter(Class<T> newEnumType) { 
        this.enumType = newEnumType; 
    } 

    public boolean canConvert(Class type) { 
        return type == enumType; 
    } 

    public Object fromString(String str) { 
        return Enum.valueOf(enumType, str); 
    } 

    public String toString(Object obj) { 
        return obj.toString(); 
    } 
} 

除了为注册位添加一行之外,其余代码不会改变:

xstream.registerConverter(EnumSingleValueConverter.create(ResultState.class));
xstream.useAttributeFor(Result.class, "name");
xstream.useAttributeFor(Result.class, "order");
xstream.useAttributeFor(Result.class, "resultState");

例如,屏幕截图中的第11行现在看起来像这样:

  

&lt; TaskResult name =“CheckValue”   resultState =“FAILURE”order =“0”/&gt;