你好,我有一个Java枚举类型,想要将包含枚举值的变量序列化为XML以进行持久化。我的枚举类型定义如下...
public enum e_Type
{
e_Unknown,
e_Categoric,
e_Numeric
}
我的变量声明如下...
private e_Type type;
我希望它可以放进一个像这样的XML标签中...
<type>value</type>
什么是在XML中持久化枚举值的最佳实践?
你好,我有一个Java枚举类型,想要将包含枚举值的变量序列化为XML以进行持久化。我的枚举类型定义如下...
public enum e_Type
{
e_Unknown,
e_Categoric,
e_Numeric
}
我的变量声明如下...
private e_Type type;
<type>value</type>
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
}
@XmlEnumValue("UNKNOWN")
e_Unknown
在收到关于第三方库的反馈后,我决定自己修复它,并想着将我的解决方案发布出来,以便其他人需要时可以查看。我只是向枚举中添加了两个静态方法,处理发送和接收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();
}
}
对我来说,这是一个很好的方法,因为这意味着在序列化/反序列化期间可以使用type()和token()方法调用我的getter和setter。 我已将此扩展到所有我的枚举中。
我使用第三方库有两个主要问题:
试试使用XStream,它是一个将对象转换为xml并支持枚举的库。
String xml = xstream.toXML(enumObject);
另一个框架是Simple XML Serialization,类似于C#的XML序列化。它可以处理包括枚举在内的任何对象图。
Serializer serializer = new Persister();
persister.write(myObject, myOutput);
我喜欢第一种方法。对于这样一个简单的任务,没有必要包含第三方库。然而,将序列化值==枚举常量文字(即“e_Unknown”,“e_Categoric”,“e_Numeric”)意味着如果开发人员重命名变量名称,则会使存储的值无法读取。例如,您在XML中保存e_Unknown,稍后将常量重命名为UNKNOWN(出于命名规范的考虑)。然后,您将无法检索旧值。
另一种方法是为每个枚举分配业务值,并将业务值存储在数据库中,以便常量名称的重命名/重构不会破坏旧的存储值。如果需要更多澄清,我已经在博客中写了关于这个问题:3 ways to serialize Java Enums
我会推荐使用JAXB 2,XStream也不错。Simple看起来很像XStream,不过这并没有多大价值。另外请注意,使用注释是可选的——在大多数情况下,它可以自动找出要使用的字段和/或方法。而且你根本不需要使用XML模式(如果你想使用可以):许多网站声称你需要使用XML模式,但这是错误的(即使Simple页面也声称了类似的事情)。
至于外部依赖项:如果你运行在JDK 1.6上,它附带了JAXB的捆绑实现(不仅是API!)。虽然这是JDK可以省略的杂质(因为并非每个人都需要它,那些需要它的人可以下载它IMO),但如果你确实需要它,它还是很好用的。实现非常好,速度非常快(只比纯粹的XML解析或写入慢50-70%)。