2013-03-28 2 views
6

Я хотел бы сериализовать некоторую EnumSet<FooType> в String, используя ее метод toString().Элегантный способ десериализации EnumSet из строки

E.g .: 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; 
} 

Но, может быть есть готовое решение, или драматически простой способ сделать это.

+0

Я не знаю такой библиотеки, и ваш метод выглядит довольно хорошо. Вместо этого я бы использовал регулярное выражение (_personal preference_) и вызывать метод 'fromString', чтобы подразумевать его обратную связь с' toString' (хотя соглашение java, скорее всего, будет похоже на 'parseEnumSet'), но я не нахожу недостаток в том, что вы делаете. – Lucas

+0

Сериализация и десериализация «вручную» часто бывают быстрее и проще отладки для простых структур, но вы обычно довольно быстро набираете угловые случаи: например, что происходит, если один из ваших перечислений содержит запятую ','? Затем вам нужно будет начать сбрасывать запятые и усложнять регулярное выражение и т. Д. –

ответ

4

С Java 8 вы можете сделать что-то подобное с Lambda expressions и ручьи:

EnumSet.copyOf(Arrays.asList(str.split(",")) 
.stream().map(FooType::valueOf).collect(Collectors.toList())) 
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, если вы можете принять формат String, как это ['COMMON', 'MEDIUM'].

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); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^