java – SimpleXML枚举区分大小写
发布时间:2020-12-15 05:08:13 所属栏目:Java 来源:网络整理
导读:我一直在尝试使用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(Str
我一直在尝试使用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”! 谢谢. 解决方法
在对源代码进行一些调查之后,我发现该库使用接口Transform将值转换为字符串.枚举转换的默认行为由类EnumTransform定义.为了自定义它,您可以定义自己的Transform类.以下版本的Transform实现将调用toString()而不是枚举对象上的默认名称().
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(); } } 转换对象由匹配方法通过Matcher接口的对象返回.可能有几个Matcher对象.库逐个尝试它们,直到它找到一个返回非null的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值编码枚举对象的工作. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |