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文本附带的屏幕截图在帖子上没有正确显示):
答案 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;