java - 通过 JAXB 为枚举提供自定义值序列化

标签 java xml enums xml-serialization jaxb

对于我正在进行的一个项目,我们使用了很多枚举。模型对象本身是由很多小类组成的;然后我们通过 JAXB 将这个模型作为 XML 序列化到我们的数据库中。现在,我们希望能够使用枚举中特定方法的返回来序列化我们的枚举值;这是给定的:

public enum Qualifier {
    FOO("1E", "Foo type document"),
    BAR("2", "Bar object");

    private String code, description;

    public Qualifier(String code, String description) {
        this.code = code;
        this.description = description;
    }

    public String getCode() {
        return this.code;
    }

    public String getDescription() {
        return this.description;
    }
}

等等。等等。目前,当序列化为 XML 时,我们会得到类似:

<qualifier>FOO</qualifier>

这就是 JAXB 处理它的方式。但是,我们需要将值作为 getCode() 的返回值,并且我们的很多枚举都遵循该约定(通过代码查找相应的静态方法),因此上述 XML 片段如下所示:

<qualifier>1E</qualifier>

相反。我们可以用 @XmlEnum@XmlEnumValue 来注解它,但这太繁琐了——有些枚举有多达 30 个枚举值,手工编辑不好。我们也在考虑使用自定义序列化程序,但我现在想避免走这条路(但如果这是要走的路,那么我没有问题)。

有什么想法吗?

最佳答案

尝试为此使用 XmlAdapter 机制。您为每个枚举类型创建一个 XmlAdapter 子类,它知道如何将枚举编码/解码到 XML。

然后将适配器与属性关联,例如

public class QualifierAdapter extends XmlAdapter<String, Qualifier> {

   public String marshal(Qualifier qualifier) {
      return qualifier.getCode();
   }

   public Qualifier unmarshal(String val) {
      return Qualifier.getFromCode(val);   // I assume you have a way of doing this
   }
}

然后在模型类中:

@XmlJavaTypeAdapter(QualifierAdapter.class)
private Qualifier qualifier;

您也可以在包级别声明它,在与模型类位于同一包中的名为 package-info.java 的文件中,使用相当特殊的包注释:

@javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters({
  @javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter(
    type=Qualifier.class, value=QualifierAdapter.class
  )
})
package com.xyz;

关于java - 通过 JAXB 为枚举提供自定义值序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4656992/

相关文章:

xml - 如何确定节点是否有子节点

c# - 序列化用内部修饰符声明的类的列表<>?

c++11 - 我需要做什么才能同时拥有 C++/CLI 和非托管 C++11 枚举类?

java - IntelliJ 无法识别 Java 枚举

java - Kafka在一段时间后停止,失去了broker

java - 从 GAE/J 调用 SOAP 服务

java - 一维数组排队 - Java - 队列 - 二维数组

java - 错误 : parse xml using java

ios - 在 Swift 中更新/更改枚举的 rawValue

java - 从注释中抛出异常