2013-03-28 6 views
6

メソッドを使用してEnumSet<FooType>からStringにシリアル化したいと思います。EnumSetをStringから逆シリアル化するためのエレガントな方法

例:EnumSet.of(FooType.COMMON, FooType.MEDIUM).toString()[COMMON, MEDIUM]となります。

質問は、このような文字列をデシリアライズしてEnumSet<FooSet>に返すエレガントな方法です。私はいくつかの一般的に知られているライブラリ(apache-commonsのような)またはそのようなもののための標準のUtilクラスを探しています。

ような何か:

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

しかし、これを行うための準備ができて解決策、または劇的に簡単な方法があるかもしれ:私は、このような方法で、この事を実装しましたEnumSetUtil.valueOf(FooType.class, "[COMMON, MEDIUM]")

+0

を私はそのようなライブラリを知っている、とあなたの方法はかなりよさそうです。私はおそらくregex(_personal preference_)を代わりに使用し、 'fromString'メソッドを呼び出して' toString'との逆の関係を暗示します(ただし、javaの規約は 'parseEnumSet'のようなものです)。しかし、あなたがしていることに欠陥があります。 – Lucas

+0

"手作業で"シリアライズしてデシリアライズすると、単純な構造ではデバッグが速くて簡単になることがよくありますが、通常は非常に高速です。例えば、enumにカンマ '、'が含まれているとどうなりますか?その後、コンマをエスケープし、正規表現などを複雑にする必要があります。 –

答えて

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

OR JSONライブラリーと別の方法あなたは、このような文字列形式を受け入れることができるかどうか['COMMON', 'MEDIUM']。あなたが行うことができますライブラリGson( ':gson 2.3.1 com.google.code.gson'):使用

0

public static EnumSet getEnumObject(Type type, String jsonStrToDeserialize) { 
    Gson gson = new Gson(); 
    return jsonStrToDeserialize == null ? null : (EnumSet) gson.fromJson(jsonStrToDeserialize, type); 
} 
関連する問題