【发布时间】: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