XStream拒绝将“ resultState”字段作为属性添加到下面的输出xml中(请参见屏幕截图),但是它对“ order”和“ name”字段正确执行了此操作。知道为什么吗?

码:

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


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

XML输出(请查看附带的屏幕截图,因为纯XML文本在帖子中未正确显示):

最佳答案

问题是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();
    }
}


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

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


例如,屏幕快照中的第11行现在如下所示:


    resultState =“ FAILURE” order =“ 0” />

07-25 21:11