将Java枚举序列化为XML的最佳做法是什么?

Sim*_*mon 2 java xml enums serialization persistence

嗨,我有一个Java枚举,我希望序列化一个包含来自XML的枚举值的变量,以实现持久性.我的枚举定义如下......

public enum e_Type
{
    e_Unknown,
    e_Categoric,
    e_Numeric
}
Run Code Online (Sandbox Code Playgroud)

我的变量被声明为......

private e_Type type;
Run Code Online (Sandbox Code Playgroud)

我希望它进入这样的XML标签......

<type>value</type>
Run Code Online (Sandbox Code Playgroud)

在XML中持久化枚举值的最佳实践是什么?

Rah*_*thy 8

看看JAXB注释,它们是JDK的一部分:

public static void main(String[] args) throws Exception {
    JAXBContext context = JAXBContext.newInstance(Foo.class);
    StringWriter sw = new StringWriter();
    context.createMarshaller().marshal(new Foo(), sw);
    System.out.println(sw);
}

@XmlRootElement
public static class Foo {
    @XmlElement
    private e_Type type = e_Type.e_Unknown;
}

@XmlEnum
public enum e_Type {
    e_Unknown,
    e_Categoric,
    e_Numeric
}
Run Code Online (Sandbox Code Playgroud)

您可以进一步自定义输出,例如,如果您希望外部XML表示与内部java枚举项目名称不同:

@XmlEnumValue("UNKNOWN")
e_Unknown
Run Code Online (Sandbox Code Playgroud)

顺便说一句:对于java类/枚举使用大写名称是一个非常强大的约定


Sim*_*mon 7

在收到有关第三方图书馆的回复之后,我决定自己解决这个问题并认为我会发布我的解决方案以防其他人需要看到它.我刚刚在枚举中添加了两个静态方法,用于处理来回发送XML的内容...

public enum e_Type
{
    e_Unknown,
    e_Categoric,
    e_Numeric;
    public static e_Type type(String token)
    {
        return e_Type.valueOf(token);
    }
    public static String token(e_Type t)
    {
        return t.name();
    }
}
Run Code Online (Sandbox Code Playgroud)

这对我来说是一个很好的方法,因为这意味着我可以在序列化/反序列化期间使用type()和token()方法调用我的getter和setter.我把它扩展到我的所有枚举中.

使用第三方库有两个主要问题:

  1. 膨胀.这对我的小坚果来说是很多大锤
  2. 依赖.添加新的第三方库意味着我必须通过许可和法律检查以及ESCROW等.对于8行代码来说真的不值得.


Luk*_*uke 5

尝试使用XStream,它是一个将对象从xml转换为xml的库,也支持枚举.

String xml = xstream.toXML(enumObject);
Run Code Online (Sandbox Code Playgroud)

http://x-stream.github.io/converters.html