2013-03-28 2 views
6

Je voudrais sérialiser certains EnumSet<FooType> à String en utilisant sa méthode toString().Manière élégante de désérialiser EnumSet à partir de la chaîne

E.g .: EnumSet.of(FooType.COMMON, FooType.MEDIUM).toString() donnera [COMMON, MEDIUM].

La question est sur la façon élégante de désérialiser une telle chaîne de retour à la EnumSet<FooSet>. Je cherche une bibliothèque communément connue (peut être comme apache-commons) ou une classe Util standard pour de telles choses.

Quelque chose comme: EnumSetUtil.valueOf(FooType.class, "[COMMON, MEDIUM]")

J'ai mis cette chose de telle façon:

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

Mais, peut-être il y a une solution prête, ou une façon spectaculaire facile pour ce faire.

+0

Je ne connais pas cette bibliothèque, et votre méthode semble assez bon. J'utiliserais probablement une regex (_personal preference_) à la place, et j'appellerais la méthode 'fromString' pour impliquer sa relation inverse à' toString' (bien que la convention de Java soit probablement quelque chose comme 'parseEnumSet'), mais je ne trouve aucun défaut dans ce que vous faites. – Lucas

+0

Sérialiser et désérialiser "à la main" est souvent plus rapide et plus facile à déboguer pour des structures simples mais vous frappez généralement très vite les cas de coin: par exemple, que se passe-t-il si l'un de vos énumérations contient une virgule ','? Ensuite, vous devrez commencer à échapper des virgules et compliquer votre regex, etc. –

Répondre

4

Avec Java 8 vous pouvez faire quelque chose comme ça avec Lambda expressions et cours d'eau:

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

goyave 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(); 

ou d'une autre manière avec la bibliothèque JSON si vous pouvez accepter le format chaîne comme celui-ci ['COMMON', 'MEDIUM'].

0

En utilisant Gson ('com.google.code.gson: gson: 2.3.1) bibliothèque que vous pouvez faire:

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