首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(反)序列化枚举集

(反)序列化枚举集
EN

Stack Overflow用户
提问于 2015-05-14 19:36:40
回答 1查看 2.8K关注 0票数 2

是否有一种使用Jackson序列化和反序列化枚举集的简单方法?

代码语言:javascript
复制
private enum Type {
    YES, NO
}

@JacksonXmlProperty(localName = "type", isAttribute = true)
private final EnumSet<Type> types;

这提供了以下XML:

代码语言:javascript
复制
...<type type="YES" type="NO"/>...

这个XML无效,因为有一个重复的属性。

我还尝试了以下注释:

代码语言:javascript
复制
@JsonSerialize(using = EnumSetSerializer.class)
@JacksonXmlProperty(localName = "type", isAttribute = true)
private final EnumSet<Type> mTypes;

但这会产生以下错误:

代码语言:javascript
复制
Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: Class com.fasterxml.jackson.databind.ser.std.EnumSetSerializer has no default (no arg) constructor
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-16 15:44:58

在这种情况下,您应该编写一个自定义EnumSet序列化程序/反序列化器,将枚举集转换为string。下面是一个完整的例子:

代码语言:javascript
复制
@SuppressWarnings({"unchecked", "raw"})
public class JacksonEnumSet {
    public enum Type {
        YES, NO
    }
    public static class Bean {
        @JacksonXmlElementWrapper(useWrapping = false)
        @JacksonXmlProperty(localName = "type", isAttribute = true)
        @JsonSerialize(using = EnumSetSerializer.class)
        @JsonDeserialize(using = EnumSetDeserializer.class)
        private final EnumSet<Type> types;

        @JsonCreator
        public Bean(@JsonProperty("type") final EnumSet<Type> types) {this.types = types;}

        public EnumSet<Type> getTypes() {return types;}

        @Override
        public String toString() {
            return "Bean{" +
                    "types=" + types +
                    '}';
        }
    }

    public static class EnumSetSerializer extends JsonSerializer<EnumSet> {

        @Override
        public void serialize(
                final EnumSet value,
                final JsonGenerator gen,
                final SerializerProvider serializers)
                throws IOException {
            final StringBuilder builder = new StringBuilder();
            for (final Object e : value) {
                if (builder.length() > 0) {
                    builder.append(";");
                }
                builder.append(e);
            }
            gen.writeString(builder.toString());
        }
    }

    public static class EnumSetDeserializer extends JsonDeserializer<EnumSet>
        implements ContextualDeserializer {
        private Class enumType;

        @Override
        public EnumSet deserialize(
                final JsonParser p,
                final DeserializationContext ctxt) throws IOException {
            final String string = p.getValueAsString();
            final EnumSet enumSet = EnumSet.noneOf(enumType);
            for (final String name : string.split(";")) {
                enumSet.add(Enum.valueOf(enumType, name));
            }
            return enumSet;
        }

        @Override
        public JsonDeserializer<?> createContextual(
                final DeserializationContext ctxt, final BeanProperty property)
                throws JsonMappingException {
            final CollectionLikeType type = (CollectionLikeType)property.getType();
            final EnumSetDeserializer enumSetDeserializer = new EnumSetDeserializer();
            enumSetDeserializer.enumType = type.getContentType().getRawClass();
            return enumSetDeserializer;
        }
    }

    public static void main(String[] args) throws IOException {
        final XmlMapper mapper = new XmlMapper();
        final Bean bean = new Bean(EnumSet.allOf(Type.class));
        final String xml = mapper.writeValueAsString(bean);
        System.out.println(xml);
        System.out.println(mapper.readValue(xml, Bean.class));
    }

}

输出:

代码语言:javascript
复制
<Bean xmlns="" type="YES;NO"></Bean>
Bean{types=[YES, NO]}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30245851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档