2014-12-22 2 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