7

我想将一些序列化为EnumSet<FooType>使用String它的toString()方法。

例如:EnumSet.of(FooType.COMMON, FooType.MEDIUM).toString()会给[COMMON, MEDIUM]

问题是关于将这样的字符串反序列化回EnumSet<FooSet>. 我正在寻找一些众所周知的库(可能像apache-commons)或用于此类事物的标准 Util 类。

就像是:EnumSetUtil.valueOf(FooType.class, "[COMMON, MEDIUM]")

我已经以这种方式实现了这个东西:

public static <E extends Enum<E>> EnumSet<E> valueOf(Class<E> eClass, String str) {
    String[] arr = str.substring(1, str.length() - 1).split(",");
    EnumSet<E> set = EnumSet.noneOf(eClass);
    for (String e : arr) set.add(E.valueOf(eClass, e.trim()));
    return set;
}

但是,可能有一个现成的解决方案,或者一个非常简单的方法来做到这一点。

4

3 回答 3

7

使用 Java 8,您可以使用Lambda 表达式和流来执行以下操作:

EnumSet.copyOf(Arrays.asList(str.split(","))
.stream().map(FooType::valueOf).collect(Collectors.toList()))
于 2015-07-31T10:50:10.963 回答
0

使用番石榴 19.0:

    Iterable<String> i = Splitter.on(",")
        .trimResults(CharMatcher.WHITESPACE.or(CharMatcher.anyOf("[]")))
        .split(str);
    Set<YourEnum> result = FluentIterable.from(i)
        .transform(Enums.stringConverter(YourEnum.class)).toSet();

或者如果您可以接受这样的字符串格式,则使用 JSON 库的另一种方式['COMMON', 'MEDIUM']

于 2015-11-05T08:18:54.180 回答
0

使用 Gson ('com.google.code.gson:gson:2.3.1') 库,您可以:

public static EnumSet getEnumObject(Type type, String jsonStrToDeserialize) {
    Gson gson = new Gson();
    return jsonStrToDeserialize == null ? null : (EnumSet) gson.fromJson(jsonStrToDeserialize, type);
}
于 2016-03-16T08:04:48.080 回答