【问题标题】:Deserialize XML to ArrayList XStream将 XML 反序列化为 ArrayList XStream
【发布时间】:2019-03-29 07:05:45
【问题描述】:

我正在尝试与我的员工 ArrayList 一起编写和读取 XML 文件。

我用一些员工 (Empleado) 对象填充 ArrayList 对象:

public class Alm_datos  extends InputSource{

    static ArrayList<Empleado> listaEmpleados = new ArrayList<>();

    public void setDatos(ArrayList<Empleado> listaEmpleados) {
        this.listaEmpleados = listaEmpleados;
    }

    public ArrayList<Empleado> getDatos() {
       return listaEmpleados;
   }

这是我的Xstream 班级:

public class Xstream {

    Alm_datos alm = new Alm_datos();
    ArrayList<Empleado> almacen = alm.getDatos();

    public void xstreamSerializar() throws FileNotFoundException{

       if(almacen == null || almacen.size() == 0){
          System.out.println(" ");
          System.out.println("--- Aún no hay empleados registrados, no se puede escribir el fichero ---");
          System.out.println(" ");
       }//END IF
        else{
          XStream xs = new XStream();
          xs.alias("Empleado", Empleado.class);
          xs.alias("ListaEmpleados", Alm_datos.class);
          xs.toXML(almacen, new FileOutputStream("EmpleadosXS.xml"));

          System.out.println(" ");
          System.out.println("--- Archivo EmpleadosXS.xml guardado correctamente ---");
          System.out.println(" ");
       }//END ELSE
    }//END METODO xstreamSerializar

Serialize 方法将我的 XML 写成这样:

<list>
  <Empleado>
    <idEmpleado>0</idEmpleado>
    <nombre>ARTURO</nombre>
    <apell1>ROJAS</apell1>
    <apell2>SOLER</apell2>
    <salario>0.0</salario>
  </Empleado>
  <Empleado>
    <idEmpleado>1</idEmpleado>
    <nombre>ARTURO</nombre>
    <apell1>BELTRAN</apell1>
    <apell2>ESTEBAN</apell2>
    <salario>0.0</salario>
  </Empleado>
  <Empleado>
    <idEmpleado>2</idEmpleado>
    <nombre>ANTONIO</nombre>
    <apell1>BELTRAN</apell1>
    <apell2>GAGO</apell2>
    <salario>0.0</salario>
  </Empleado>
  <Empleado>
    <idEmpleado>3</idEmpleado>
    <nombre>ANGEL</nombre>
    <apell1>MARTIN</apell1>
    <apell2>HARO</apell2>
    <salario>0.0</salario>
  </Empleado>
  <Empleado>
    <idEmpleado>4</idEmpleado>
    <nombre>PERICO</nombre>
    <apell1>PEREZ</apell1>
    <apell2>VILLANUEVA</apell2>
    <salario>0.0</salario>
  </Empleado>
  <Empleado>
    <idEmpleado>5</idEmpleado>
    <nombre>CARLOS</nombre>
    <apell1>BLANCO</apell1>
    <apell2>MARTIN</apell2>
    <salario>0.0</salario>
  </Empleado>
  <Empleado>
    <idEmpleado>6</idEmpleado>
    <nombre>PABLO</nombre>
    <apell1>ROJAS</apell1>
    <apell2>FERNANDEZ</apell2>
    <salario>0.0</salario>
  </Empleado>
  <Empleado>
    <idEmpleado>7</idEmpleado>
    <nombre>ALEJANDRO</nombre>
    <apell1>POZA</apell1>
    <apell2>MARTIN</apell2>
    <salario>0.0</salario>
  </Empleado>
  <Empleado>
    <idEmpleado>8</idEmpleado>
    <nombre>DANIEL</nombre>
    <apell1>POZA</apell1>
    <apell2>SAGUNTO</apell2>
    <salario>0.0</salario>
  </Empleado>
  <Empleado>
    <idEmpleado>9</idEmpleado>
    <nombre>ANGEL</nombre>
    <apell1>POZA</apell1>
    <apell2>MARTIN</apell2>
    <salario>0.0</salario>
  </Empleado>
  <Empleado>
    <idEmpleado>10</idEmpleado>
    <nombre>ANGEL</nombre>
    <apell1>POZA</apell1>
    <apell2>LUNA</apell2>
    <salario>0.0</salario>
  </Empleado>
  <Empleado>
    <idEmpleado>11</idEmpleado>
    <nombre>MARIA</nombre>
    <apell1>SAGUNTO</apell1>
    <apell2>BELTRAN</apell2>
    <salario>0.0</salario>
  </Empleado>
  <Empleado>
    <idEmpleado>12</idEmpleado>
    <nombre>ALEJANDRO</nombre>
    <apell1>FERNANDEZ</apell1>
    <apell2>GARCIA</apell2>
    <salario>0.0</salario>
  </Empleado>
  <Empleado>
    <idEmpleado>13</idEmpleado>
    <nombre>HECTOR</nombre>
    <apell1>FRIAS</apell1>
    <apell2>PEREZ</apell2>
    <salario>0.0</salario>
  </Empleado>
  <Empleado>
    <idEmpleado>14</idEmpleado>
    <nombre>CRISTOBAL</nombre>
    <apell1>GARCIA</apell1>
    <apell2>PEREZ</apell2>
    <salario>0.0</salario>
  </Empleado>
  <Empleado>
    <idEmpleado>15</idEmpleado>
    <nombre>MARIO</nombre>
    <apell1>SOLER</apell1>
    <apell2>MARTINEZ</apell2>
    <salario>0.0</salario>
  </Empleado>
  <Empleado>
    <idEmpleado>16</idEmpleado>
    <nombre>JORGE</nombre>
    <apell1>CERVANTES</apell1>
    <apell2>PASCUAL</apell2>
    <salario>0.0</salario>
  </Empleado>
  <Empleado>
    <idEmpleado>17</idEmpleado>
    <nombre>VICTOR</nombre>
    <apell1>MARTIN</apell1>
    <apell2>MONTES</apell2>
    <salario>0.0</salario>
  </Empleado>
  <Empleado>
    <idEmpleado>18</idEmpleado>
    <nombre>ANGEL</nombre>
    <apell1>FERNANDEZ</apell1>
    <apell2>DIAZ</apell2>
    <salario>0.0</salario>
  </Empleado>
  <Empleado>
    <idEmpleado>19</idEmpleado>
    <nombre>ANDRES</nombre>
    <apell1>VILLANUEVA</apell1>
    <apell2>POZA</apell2>
    <salario>0.0</salario>
  </Empleado>
</list>

但我不知道如何阅读 XML,这是我的代码:

    public void xstreamDesSerializar() throws FileNotFoundException{

        almacen.clear();

        XStream xs= new XStream();
        xs.alias("Empleado", Empleado.class);
        xs.alias("ListaEmpleados", Alm_datos.class);
        Empleado almacen = (Empleado) xs.fromXML(new FileInputStream("EmpleadosXS.xml"));  // The problem is here 

    }//END METODO des-serializar

 }//END CLASS

Netbeans 错误:

Security framework of XStream not initialized, XStream is probably vulnerable.
Exception in thread "main" com.thoughtworks.xstream.converters.ConversionException: 
---- Debugging information ----
cause-exception     : com.thoughtworks.xstream.mapper.CannotResolveClassException
cause-message       : Empleado
class               : java.util.ArrayList
required-type       : java.util.ArrayList
converter-type      : com.thoughtworks.xstream.converters.collections.CollectionConverter
path                : /list/Empleado
line number         : 2
version             : 1.4.11
-------------------------------

【问题讨论】:

    标签: java arrays class arraylist xstream


    【解决方案1】:

    XML 的根是员工列表 (Empleados),但是当您反序列化 XML 时,您试图将结果放入单个员工 (Empleado) 对象中,因此,您应该将你的演员表从 (Empleado) 更改为 (ArrayList&lt;Empleado&gt;),如下所示:

    ArrayList<Empleado> almacen = (ArrayList<Empleado>) xs.fromXML(
                                                           new FileInputStream("EmpleadosXS.xml"));
    

    但请注意,Alm_datos 类应该是 XML 的根,因此在创建 XML 时应该使用alm 变量,而不是almacen 变量:

    xs.toXML(alm, new FileOutputStream("EmpleadosXS.xml"));
    

    然后在获取 XML 时再次:

    Alm_datos alm = (Alm_datos) xs.fromXML(new FileInputStream("EmpleadosXS.xml"));
    

    【讨论】:

      猜你喜欢
      • 2013-03-24
      • 1970-01-01
      • 1970-01-01
      • 2013-07-02
      • 1970-01-01
      • 2015-04-13
      • 2012-02-25
      • 2012-10-14
      • 1970-01-01
      相关资源
      最近更新 更多