当前位置: 首页 > 面试题库 >

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

洪黎昕
2023-03-14
问题内容

对于我正在从事的项目,我们使用了许多枚举。模型对象本身由许多微小的类组成。然后,通过该模型,我们通过JAXB将XML序列化为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;


 类似资料:
  • 枚举具有名为'hash value'的属性,该属性是枚举内的索引。

  • 问题内容: 我了解是可序列化的。因此,这样做是安全的。(selectedCountry是) 没有客户成员变量的原始枚举 分段 但是,如果我在自定义枚举类中有不可序列化的成员,该怎么办?例如, 原始枚举客户成员变量 我测试了 有用。(我通过在序列化之前和之后打印出所有成员变量的值进行了测试。它们在前后均相同) 但是,我不明白为什么会起作用? 由于我没有提供适当的和,因此需要界面提供。 如有效Java

  • enum 关键字允许创建一个代表数个可能变量的数据的类型(原文:The enum keyword allows the creation of a type which may be one of a few different variants.若您对此句有 更好的翻译或理解,希望指出来,谢谢。)。在 struct 中任何合法的变量在 enum 同样是合法的。 // 隐藏未使用代码警告的属性。

  • 问题内容: 遵循在使用GSON解析JSON时使用枚举中的建议,我正在尝试序列化其键是使用Gson 的映射。 考虑以下类别: 两个问题: 为什么打印而不是? 我该如何打印? 问题答案: Gson对密钥使用了专用的序列化器。默认情况下,它使用将要用作键的对象的。对于类型,基本上就是常量的名称。,默认为类型,仅当将序列化为JSON值(对名称除外)时才使用。 使用来构建你的实例。

  • 问题内容: 我无法使用从常量中获取的枚举作为注释中的参数。我收到此编译错误:“注释属性[attribute]的值必须是枚举常量表达式”。 这是枚举代码的简化版本: 对于注释: 和班级: 该错误仅在方法B的“ theEnum = MYENUM_CONSTANT”中显示。字符串和int常量对于编译器是可以的,但Enum常量不是,即使它的值与methodA上的值完全相同。在我看来,这是编译器中缺少的功能

  • 问题内容: 我想要一个Java枚举,其值是整数。 例如: 但是我也想要这两个常量的自定义名称, 例如“ Task Created”和“ Task Deleted”(那里有空格)。 我想尽可能优雅地做到这一点,而无需编写 太多额外的代码。 我可以在没有其他 将枚举常量映射到其自定义名称的映射的情况下实现此目标吗? 我在该项目中使用JDK 6。 问题答案: 只需为此添加一个字段: 如果您不想指定字符串