4

我一直在尝试使用 simplexml 库(v2.6.2) http://simple.sourceforge.net/home.php创建一个 XML

我要创建的 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”!

谢谢。

4

3 回答 3

14

在对源代码进行一些调查后,我发现该库使用接口Transform将值转换为字符串。枚举转换的默认行为由 class 定义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();
    }
}

Transformmatch对象由接口对象从方法返回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 值对枚举对象进行编码的工作。

于 2012-04-09T07:04:31.233 回答
1

你应该覆盖toString()

@Override 
public String toString() {
       return this.value.toLowerCase();
}

然后使用写结果

serializer.write(example.toString(), result);
于 2012-04-09T07:12:39.123 回答
0

我会查看序列化程序代码并且不明白它在做什么,因为您没有注释任何字段......(根据他们的文档)应该引发异常。

于 2012-04-09T07:02:22.950 回答