You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JDK17环境下使用XStream将ArrayList转XML文件时出现转换异常如何解决?

问题根因
  • JDK 17作为高版本JDK,自带的模块系统对Java核心类库做了强封装限制,XStream默认使用反射转换器访问java.util包下ArrayList等类的私有成员时没有权限,触发模块访问限制报错
  • XStream未配置自定义类istat.ArrayData、istat.Dati的序列化规则,找不到对应转换器
解决方案

方案1:仅添加JVM启动参数(无需修改代码)

在Eclipse中给运行项添加启动参数即可解决权限问题:

  1. 右键你的项目 -> 选择Run As -> Run Configurations
  2. 找到你当前运行的Running类对应的Java Application配置项
  3. 切换到Arguments选项卡,在VM arguments输入框中添加以下参数:
--add-opens java.base/java.util=ALL-UNNAMED
  1. 点击Apply保存后重新运行即可

方案2:修改XStream配置(推荐,无需改启动参数,兼容性更好)

直接修改arrayToXML方法的XStream配置,补充安全规则和转换规则即可:

public void arrayToXML() {
      XStream xstream = new XStream(new StaxDriver());
      // 初始化默认安全配置
      XStream.setupDefaultSecurity(xstream);
      // 允许XStream序列化你的自定义类
      xstream.allowTypes(new Class[]{ArrayData.class, Dati.class});
      // 给自定义类设置别名,生成的XML标签更简洁
      xstream.alias("arrayData", ArrayData.class);
      xstream.alias("dati", Dati.class);
      // 如果ArrayData是继承自ArrayList的子类,指定用集合转换器处理
      xstream.addDefaultImplementation(ArrayList.class, ArrayData.class);
      
      String xml =  xstream.toXML(list);
      FileWriter fw = null;
      try {
          fw = new FileWriter(new File("ArrayList.xml"));
          fw.write(xml);
      }catch(Exception e) {
          e.printStackTrace();
      } finally {
          // 补充资源关闭逻辑,避免资源泄漏
          if (fw != null) {
              try {
                  fw.close();
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }
      }
}
补充注意事项
  • 请将你的XStream依赖升级到1.4.20及以上稳定版本,旧版本对JDK17的兼容性差,可能仍会报错
  • 若修改代码后仍有权限报错,可配合方案1的启动参数同时使用,即可完全解决问题

内容的提问来源于stack exchange,提问作者aNoob13

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 05:27:00