gpt4 book ai didi

java - XStream useAttributeFor 不起作用

转载 作者:行者123 更新时间:2023-11-30 04:01:54 25 4
gpt4 key购买 nike

XStream 拒绝在下面的输出 xml 中添加“resultState”字段作为属性(请参见屏幕截图),但它对“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 文本在帖子中无法正确显示): enter image description here

最佳答案

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

另请查看这篇文章,了解使用泛型的转换器实现: enums as attributes

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

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 行现在如下所示:

<TaskResult name="CheckValue" resultState="FAILURE" order="0"/>

关于java - XStream useAttributeFor 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21779004/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com