2013-03-28 4 views
6

EnumSet<FooType>을 메서드를 사용하여 String으로 serialize하고자합니다.String에서 EnumSet을 비 직렬화하는 우아한 방법

예 : EnumSet.of(FooType.COMMON, FooType.MEDIUM).toString()[COMMON, MEDIUM]입니다.

질문은 EnumSet<FooSet> 등의 문자열을 역 직렬화하는 우아한 방법에 관한 것입니다. 나는 일반적으로 알려진 라이브러리 (apache-commons과 같을 수도 있음) 나 그런 것들을위한 표준 Util-class를 찾고있다. 같은

뭔가 : 나는 그런 방식으로이 일을 구현했습니다 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

자바 (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']. GSON를 사용

0

('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); 
} 
관련 문제