将XML反序列化为ArrayList XStream

时间:2018-10-24 19:02:31

标签: java arrays class arraylist xstream

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

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

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
-------------------------------

1 个答案:

答案 0 :(得分:0)

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

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"));