2013-03-28 41 views
6

我想使用它的toString()方法序列化一些EnumSet<FooType>String從字符串反序列化EnumSet的優雅方法

例如: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庫的另一種方式,如果你能接受這樣的字符串格式['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); 
}