Десериализовать XML в ArrayList XStream - PullRequest
0 голосов
/ 24 октября 2018

Я пытаюсь написать и прочитать файл XML с моим сотрудником ArrayList.

Я заполняю объект 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 голосов
/ 21 ноября 2018

Корнем вашего XML является список сотрудников (Empleado s), но когда вы десериализуете XML, вы пытаетесь поместить результат в один объект сотрудника (Empleado), поэтому выследует изменить ваше приведение с (Empleado) на (ArrayList<Empleado>), например:

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

Но учтите, что ваш класс Alm_datos должен быть корнем вашего XML, поэтому вы должны использовать переменную almвместо переменной almacen при создании XML:

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

И снова при получении XML:

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