首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java xStream processAnnotations并发

Java xStream processAnnotations并发
EN

Stack Overflow用户
提问于 2014-12-22 13:27:01
回答 2查看 912关注 0票数 1

实际上,我只想要一个XStream实例。所以我有下一课:

代码语言:javascript
复制
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之前同步,这看起来很好:

代码语言:javascript
复制
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);
}

我想知道这种用法是否正确。如有任何建议,敬请见谅。

EN

回答 2

Stack Overflow用户

发布于 2014-12-23 03:02:16

最后,我们决定通过xStream类( instance )共享实例,并在多线程环境中重用它:

代码语言:javascript
复制
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;
    }
}
票数 2
EN

Stack Overflow用户

发布于 2014-12-23 14:25:15

那么xstream的单例实现如何呢?

一个快速的例子可以找到here

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27603657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档