2014-02-14 39 views
1

XStream拒绝在下面的输出xml中添加“resultState”字段作为属性,但它对于“order”和“name”字段正确执行。任何想法为什么?XStream useAttributeFor不起作用

代码:

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

+0

哪种类型是resultState的?一个正常的字符串或其他东西? – Matthias

+0

@Matthias它是一个名为ResultState的枚举 – jule64

回答

2

问题是ResultState类是一个枚举类型,并且Xstream不知道如何将枚举传递为属性而没有一点帮助。该解决方案是创建一个转换器类为枚举并将其注册到XStream的实例作为本SO后解释说: 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(); 
    } 
} 

的代码的其余部分不只是我们改变为t添加一行他登记位:

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

作为一个例子,在屏幕截图线11现在看起来像这样:

< TaskResult名称= "校验值" resultState = " FAILURE "顺序=/>