2013-03-28 12 views
6

Chciałbym serializować niektóre EnumSet<FooType> do String przy użyciu metody toString().Elegancki sposób deserializacji EnumSet z ciągu

Np .: EnumSet.of(FooType.COMMON, FooType.MEDIUM).toString() da [COMMON, MEDIUM].

Pytanie dotyczy eleganckiego sposobu deserializacji takiego łańcucha z powrotem na EnumSet<FooSet>. Szukam jakiejś powszechnie znanej biblioteki (może być jak apache-commons) lub standardowej klasy Util dla takich rzeczy.

Coś jak: EnumSetUtil.valueOf(FooType.class, "[COMMON, MEDIUM]")

I zostały wdrożone to coś w taki sposób:

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

Ale może jest gotowe rozwiązanie, albo dramatycznie łatwy sposób to zrobić.

+0

Nie znam takiej bibliotece, a metoda wygląda całkiem dobrze. Prawdopodobnie użyłbym zamiast tego regex (_personal preference_) i wywołałbym metodę 'fromString', aby implikować jej odwrotną relację do' toString' (chociaż konwencja java prawdopodobnie byłaby czymś w stylu 'parseEnumSet'), ale nie znajduję żadnego Wada w tym, co robisz. – Lucas

+0

Serializacja i deserializacja "ręcznie" jest często szybsza i łatwiejsza do debugowania dla prostych struktur, ale zazwyczaj trafia się dość szybko w przypadki narożne: na przykład co się stanie, jeśli jeden z twoich wyliczeń zawiera przecinek ','? Następnie musisz zacząć od przecinków i komplikować swoje wyrażenie regularne, itd .. –

Odpowiedz

4

Z Java 8 można zrobić coś takiego z Lambda expressions i strumieni:

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

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

czy inny sposób z biblioteki JSON czy można przyjąć format string takiego ['COMMON', 'MEDIUM'].

0

Korzystanie Gson ('com.google.code.gson: gson: 2.3.1') biblioteki można zrobić:

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