Java设置XStream反序列化规则

Java设置XStream反序列化规则,java,xml,serialization,xstream,Java,Xml,Serialization,Xstream,我有一个类,它带有codeBasedenum字段。我有这个类的xml序列化对象。但是,当我尝试使用XStream反序列化此xml时,我收到: com.thoughtworks.xstream.converters.ConversionException:无枚举常量com.functest.util.TriState.0:无枚举常量com.functest.util.TriState.0 阶级 xmlParameters字符串 <Params> <clientCode&g

我有一个类,它带有codeBased
enum
字段。我有这个类的xml序列化对象。但是,当我尝试使用
XStream
反序列化此xml时,我收到:

com.thoughtworks.xstream.converters.ConversionException:无枚举常量com.functest.util.TriState.0:无枚举常量com.functest.util.TriState.0

阶级

xmlParameters字符串

<Params>
    <clientCode>1516001</clientCode>
    <triState>0</triState>
</Params>
我尝试像这样反序列化xml:

XStream xStream = new XStream();
xStream.alias("triState", TriState.class);
Params p = (Params) xStream.fromXML(xmlParameters);

如何设置反序列化规则以从xml获取值并调用枚举方法
fromCode(0)

将fromCode转换为静态方法:

public enum TriState {
    YES(1),NO(0),UNDEFINED(-1);
    int code;
    private TriState(int code) {
        this.code = code;
    }
    public static TriState fromCode(int code) {
        if (code == 1)
            return YES;
        if (code == 0)
            return NO;
        return UNDEFINED;
    }
}
并定义使用静态方法将代码转换为有效枚举的转换器:

public class TriStateConverter implements Converter {
    public boolean canConvert(Class type) {
        return TriState.class==type;
    }
    public void marshal(Object o, HierarchicalStreamWriter writer, MarshallingContext mc) {
        writer.setValue(Integer.toString(((TriState)o).code));
    }
    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext uc) {
        return TriState.fromCode(Integer.parseInt(reader.getValue()));
    }
}
我还没有试过这个代码,但应该可以用

public enum TriState {
    YES(1),NO(0),UNDEFINED(-1);
    int code;
    private TriState(int code) {
        this.code = code;
    }
    public static TriState fromCode(int code) {
        if (code == 1)
            return YES;
        if (code == 0)
            return NO;
        return UNDEFINED;
    }
}
public class TriStateConverter implements Converter {
    public boolean canConvert(Class type) {
        return TriState.class==type;
    }
    public void marshal(Object o, HierarchicalStreamWriter writer, MarshallingContext mc) {
        writer.setValue(Integer.toString(((TriState)o).code));
    }
    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext uc) {
        return TriState.fromCode(Integer.parseInt(reader.getValue()));
    }
}