2013-03-28 8 views
6

Ich möchte einige EnumSet<FooType> zu String mit seiner toString() Methode serialisieren.Eleganter Weg zum Deserialisieren EnumSet von String

Zum Beispiel: EnumSet.of(FooType.COMMON, FooType.MEDIUM).toString() ergibt [COMMON, MEDIUM].

Die Frage ist über elegante Möglichkeit, solche Schnur wieder zu der EnumSet<FooSet> deserialize. Ich suche nach einer allgemein bekannten Bibliothek (kann wie apache-commons sein) oder einer Standard-Util-Klasse für solche Dinge.

Etwas wie: EnumSetUtil.valueOf(FooType.class, "[COMMON, MEDIUM]")

ich diese Sache in einer solchen Art und Weise implementiert haben:

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

Aber kann es fertige Lösung ist, oder dramatisch einfacher Weg, dies zu tun.

+0

Ich kenne keine solche Bibliothek und Ihre Methode sieht ziemlich gut aus. Ich würde wahrscheinlich stattdessen eine Regex (_personal preference_) verwenden, und rufen Sie die Methode 'fromString', um seine inverse Beziehung zu toString implizieren (obwohl die Java-Konvention wäre wahrscheinlich so etwas wie' parseEnumSet'), aber ich finde keine Fehler in dem, was Sie tun. – Lucas

+0

Serialisierung und Deserialisierung "von Hand" ist oft schneller und einfacher zu debuggen für einfache Strukturen, aber Sie treffen in der Regel ziemlich schnell die Ecke Fällen: zum Beispiel, was passiert, wenn ein Enum ein Komma enthält, '? Dann müssen Sie beginnen Kommas zu entkommen und Ihre Regex, etc .. komplizieren. –

Antwort

4

Mit Java 8 Sie können mit Lambda expressions etwas zu tun und Bäche:

EnumSet.copyOf(Arrays.asList(str.split(",")) 
.stream().map(FooType::valueOf).collect(Collectors.toList())) 
0

Mit Guave 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(); 

oder eine andere Art und Weise mit JSON-Bibliothek, wenn Sie String-Format wie diese annehmen können ['COMMON', 'MEDIUM'].

0

Mit Gson ('com.google.code.gson: Gson: 2.3.1) Bibliothek können Sie tun:

public static EnumSet getEnumObject(Type type, String jsonStrToDeserialize) { 
    Gson gson = new Gson(); 
    return jsonStrToDeserialize == null ? null : (EnumSet) gson.fromJson(jsonStrToDeserialize, type); 
} 
Verwandte Themen