XStream no-args constructor

 

今天工作中遇到了这个问题:

com.thoughtworks.xstream.converters.ConversionException: Cannot construct ClassXXX as it does not have a no-args constructor : Cannot construct java.util.RandomAccessSubList as it does not have a no-args constructor

 

害得我跟我们同事忙活了一个下午才搞定

 

一般出现这个问题是因为在使用XStream时,某些类没有实现序列化,且又没有空的构造器。这些类一般是第三方包中的,自己写的类直接实现序列化或添加一个空的构造器就行了。

 

解决这个问题可以有两种实现方式:

1. 使用Converter,把这个类的对象反序列化

例如:

 

public class RandomAccessSubListConverter extends CollectionConverter {

public RandomAccessSubListConverter(Mapper mapper) {
    super(mapper); 
} 

@Override
public boolean canConvert(Class arg0) {     
    return arg0.getName().equals("java.util.RandomAccessSubList");
}

@Override
public Object unmarshal(HierarchicalStreamReader reader,
        UnmarshallingContext context) {        
    reader.moveDown();
    ArrayList arrayList = new ArrayList();
    populateCollection(reader, context, arrayList);
    reader.moveUp();
    return arrayList;
}

 

2. 可以升级JDK到6.XX版本以上,XStream就可以支持非序列化且没有空构造器的类了。
 
 
今天遇到的这个问题的原因就是因为JDK版本的问题造成的。
在WebLogic下,大多数人都喜欢用jrocket的JDK,因为Oracle宣称它是最快的JDK,但是oracle 11g自带的JDK和XStream存在这个兼容问题。
 
我们换回了JDK 1.6.22,问题就解决了。
 
见老外的讨论:

你可能感兴趣的:(Constructor)