我一直在尝试使用simplexml库创建XML(v2.6.2) http://simple.sourceforge.net/home.php
我想要创建的XML必须保存枚举值,该值应区分大小写。以下是POJO:
package pojos;
public enum MyEnum {
NEW("new"),
OLD("old");
private final String value;
MyEnum(String v)
{
value = v;
}
public String value() {
return value;
}
public static MyEnum fromValue(String v) {
for (MyEnum c: MyEnum.values()) {
if (c.value.equals(v)) {
return c;
}
}
throw new IllegalArgumentException(v);
}
}
以下是序列化代码:
import java.io.File;
import org.simpleframework.xml.Serializer;
import org.simpleframework.xml.core.Persister;
import pojos.MyEnum;
public class TestEnum {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Serializer serializer = new Persister();
MyEnum example = MyEnum.NEW;
File result = new File("myenum.xml");
serializer.write(example, result);
}
}
结果输出:
<myEnum>NEW</myEnum>
所需的输出:
<myEnum>new</myEnum>
我该怎么办?我无法更改枚举中的变量名称,因为它恰好是关键字“new”!
感谢。
答案 0 :(得分:12)
在对源代码进行一些调查之后,我发现该库使用接口Transform
将值转换为字符串。枚举转换的默认行为由类EnumTransform
定义。为了自定义它,您可以定义自己的Transform类。以下版本的Transform
实现会在枚举对象上调用toString()
而不是默认的name()
。
class MyEnumTransform implements Transform<Enum> {
private final Class type;
public MyEnumTransform(Class type) {
this.type = type;
}
public Enum read(String value) throws Exception {
for (Object o : type.getEnumConstants()) {
if (o.toString().equals(value)) {
return (Enum) o;
}
}
return null;
}
public String write(Enum value) throws Exception {
return value.toString();
}
}
{p} Transform
对象由match
接口的对象从Matcher
方法返回。可能有几个Matcher
个对象。库逐个尝试它们,直到找到一个返回非空Transformer
对象的库。您可以定义自己的Matcher
对象,并将其作为参数传递给Persister
类的构造函数。此对象将获得最高优先级。
Persister serializer = new Persister(new Matcher() {
public Transform match(Class type) throws Exception {
if (type.isEnum()) {
return new MyEnumTransform(type);
}
return null;
}
});
最后,你不会忘记在你的枚举类上定义一个toString方法。然后,上面的代码组合将使用它们的toString值编写枚举对象的工作。
答案 1 :(得分:1)
您应该覆盖toString()
@Override
public String toString() {
return this.value.toLowerCase();
}
然后使用
编写结果serializer.write(example.toString(), result);
答案 2 :(得分:0)
我会查看serializer code并了解其中的内容,因为您没有注释任何字段...(根据他们的文档)应该抛出异常。