Xstream和枚举反序列化:没有枚举常量

5

以下是我想解析的 XML 片段:

<node version="1.0.7" errorCode="0" message="">

errorCode实际上是一组固定的常量,因此我认为将其表示为枚举是个好主意:

public enum ErrorCode {
 OK (0,"ok"),
 ERR (1,"Error"),
 BIGERR (2,"Big Error");

 private int code;

 private String name;

 ErrorCode(int code, String name) {...}
}

我不知道如何将xml文件中的“0”与我枚举定义的各个常量进行映射...

我一直收到转换异常,没有枚举常量:

com.thoughtworks.xstream.converters.ConversionException: No enum constant my.package.ErrorCode.0

我不知道如何指定值的别名...(或者是否需要实现自己的转换器)。

谢谢...

2个回答

4
我已经使用EnumToStringConverter完成了这个任务。
Map<String, ErrorCode> map = new HashMap<>();
map.put(ErrorCode.OK.getCode(), Error.OK);
map.put(ErrorCode.ERR.getCode(), Error.ERR);
map.put(ErrorCode.BIGERR.getCode(), Error.BIGERR);
xstream.registerConverter(new EnumToStringConverter<>(ErrorCode.class, map);

1

我曾经遇到过同样的问题,通过创建一个转换器类来解决了它。

public class MyEnumConverter implements Converter {

    public static MyEnumConverter getInstance() {
    return new MyEnumConverter();
    }

    public void marshal(Object value, HierarchicalStreamWriter writer,
            MarshallingContext context) {
         writer.setValue(((MyEnum) value).name());
    }

    //method that return the enum value by string
    //if value equals return the correct enum value
    public Object unmarshal(HierarchicalStreamReader reader,
            UnmarshallingContext context) {
        return MyEnum.get(reader.getValue()); //method get implemented in enum
    }

    @SuppressWarnings("rawtypes")
    public boolean canConvert(Class clazz) {
        return MyEnum.class.isAssignableFrom(clazz);
    }
}

不要忘记注册转换器

xstream.registerConverter(MyEnumConverter.getInstance());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接