【问题标题】:How to get enum class in generic method?如何在泛型方法中获取枚举类?
【发布时间】:2017-11-06 23:09:53
【问题描述】:

我正在尝试创建一种标准方法来序列化和反序列化 Jackson 上的 Enum。

我的序列化很简单:

public class EnumSerializer extends JsonSerializer<Enum<?>> {

    @Override
    public void serialize(Enum<?> data, JsonGenerator gen, SerializerProvider provider)
            throws IOException, JsonProcessingException {

        if (data == null) {
            gen.writeString("");
        } else {
            gen.writeString(data.name());
        }
    }
}

现在我正在开发反序列化器:

public class EnumDeserializer extends JsonDeserializer<Enum<?>> {

    @Override
    public Enum<?> deserialize(JsonParser jsonparser, DeserializationContext deserializationcontext)
            throws IOException, JsonProcessingException {

        String dataStr = jsonparser.getText();
        if (dataStr == null || dataStr.isEmpty()) {
            return null;
        } else {
            Class<Enum<?>> enumClass = null;   // How can I get enumClass?
            for(Enum<?> one: enumClass.getEnumConstants()){
                if(one.name().equals(dataStr)){
                    return one;
                }
            }
            return null;
        }
    }
}

但是你可以看到我在获取 enumClass 时遇到了麻烦。

你能帮帮我吗?

谢谢!

【问题讨论】:

  • Enum.class 有什么问题?
  • 在序列化数据时,您没有保存任何关于类的信息,因此您必须从序列化数据以外的其他位置确定类。可能是构造函数参数。
  • 假设你可以获取类,有一个更简单的获取常量的方法:Enum.valueOf(enumClass, dataStr)
  • 我看不出这个问题与泛型有什么关系。
  • 有时最好不要懒惰并为每个枚举类型编写序列化器/反序列化器。如果你想拥有通用反序列化器,那么你必须将枚举类传递给它,考虑到@JsonDeserialize 注释不带参数,这几乎是不可能的。看看它是如何创建上下文 JsonSerializer 的,也许它可以引导你走向正确的方向:stackoverflow.com/questions/22634860/…

标签: java generics enums jackson


【解决方案1】:

如果你真的想创建自定义的EnumDeserializer,你可以看看 Jackson 的实现: com.fasterxml.jackson.databind.deser.std.EnumDeserializer

但正如我所见,您尝试实现杰克逊的标准行为。

【讨论】:

  • 谢谢,我知道 Jackson 有默认实现来满足我的要求。我的真实案例不在Jackson上,是​​在另一个Json工具上,这里很难把所有代码都带过来,所以我只是借用Jackson作为示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多