实际上,我只想要一个XStream实例。所以我有下一课:
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);
}我想知道这种用法是否正确。如有任何建议,敬请见谅。
发布于 2014-12-23 03:02:16
最后,我们决定通过xStream类( instance )共享实例,并在多线程环境中重用它:
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;
}
}发布于 2014-12-23 14:25:15
那么xstream的单例实现如何呢?
一个快速的例子可以找到here!
https://stackoverflow.com/questions/27603657
复制相似问题