2014-12-22 6 views
0

사실 저는 하나의 XStream 인스턴스 만 원합니다. 그래서 아래 클래스가 있습니다 :Java xStream processAnnotations concurrency

public class XSteamTool{ 
    private static XStream xStream = new XStream(); 

    static{ 
     xStream.ignoreUnknownElements(); 
     xStream.registerConverter(new DateConverter(TimeZone.getDefault())); 
    } 

    public static String objToXml(Object obj){ 
     xStream.processAnnotations(obj.getClass()); 
     return xStream.toXML(obj); 
    } 

    public static <T> T xmlToObj(String xmlString, Class<T> clazz){ 
     xStream.processAnnotations(clazz); 
     return(T)xStream.fromXML(xmlString); 
    } 
} 

그러나이 문제는 멀티 스레드 환경에서 발생합니다. 공식 문서에서 해당 노트를 찾습니다. XStream은 스레드 안전입니다. 불행하게도 주석 잘 개체 마샬링이 나는 동기 전에 processAnnotations 그 시도
을 처리하는 동안 현재 적용되는 구성의 변화를 보이는 정의된다

public static String objToXml(Object obj){ 
    synchronized (obj.getClass()) { 
     xStream.processAnnotations(obj.getClass());    
    } 
    return xStream.toXML(obj); 
} 

public static <T> T xmlToObj(String xmlString, Class<T> clazz){ 
    synchronized (clazz) { 
     xStream.processAnnotations(clazz);    
    } 
    return(T)xStream.fromXML(xmlString); 
} 

가 궁금 사용이 맞다면 . 모든 제안을 부탁드립니다. 마침내

답변

0

우리가합니다 (XStream을 init을 한 번만 및 멀티 스레드 환경에서 재사용) 클래스하여 XStream의 인스턴스를 공유하기로 결정 :

private static Map<Class<?>, XStream> xStreamMap = Collections.synchronizedMap(new HashMap<Class<?>, XStream>()); 

private static XStream getXStreamInstance(Class<?> clazz) { 
    if (xStreamMap.containsKey(clazz)) { 
     return xStreamMap.get(clazz); 
    } 
    synchronized (clazz) { 
     if (xStreamMap.containsKey(clazz)) { 
      return xStreamMap.get(clazz); 
     } 
     XStream xStream = new XStream(new XppDriver(new NoNameCoder())); 
     xStream.ignoreUnknownElements(); 
     xStream.registerConverter(new DateConverter(TimeZone.getDefault())); 
     xStream.processAnnotations(clazz); 
     xStreamMap.put(clazz, xStream); 
     return xStream; 
    } 
} 
0

무엇 XStream과의 싱글 구현에 대해?

빠른 예가 here입니다!

+0

감사합니다. 그러나 그것은 싱글 톤에 관한 것이 아닙니다. – bluearrow