XStream no-args constructor

本文介绍了在使用XStream进行序列化时遇到的问题,即无法构造未实现序列化的第三方类java.util.RandomAccessSubList,该类缺少无参构造器。文章提供了两种解决方案:一是通过自定义Converter来处理反序列化过程;二是升级JDK版本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

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

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,问题就解决了。
 
见老外的讨论:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值