una tutorial serializar serializacion readobject objetos manejo leer guardar fichero escribir datos con como clase archivos agenda java file serialization

tutorial - Cómo escribir y leer objetos serializados de java en un archivo



serializacion (4)

¿Por qué no serializar toda la lista a la vez?

FileOutputStream fout = new FileOutputStream("G://address.ser"); ObjectOutputStream oos = new ObjectOutputStream(fout); oos.writeObject(MyClassList);

Suponiendo, por supuesto, que MyClassList es una ArrayList o LinkedList u otra colección de Serializable .

En el caso de leerlo nuevamente, en su código usted prepara solo un artículo, no hay un bucle para reunir todo el artículo escrito.

Voy a escribir varios objetos en un archivo y luego los recuperaré en otra parte de mi código. Mi código no tiene ningún error, pero no funciona correctamente. ¿Podrían ayudarme a encontrar lo que está mal con mi código? He leído diferentes códigos de diferentes sitios web, ¡pero ninguno funcionó para mí!

Aquí está mi código para escribir mis objetos en un archivo: MyClassList es una lista de matrices que incluye objetos de mi clase (que deben escribirse en un archivo).

for (int cnt = 0; cnt < MyClassList.size(); cnt++) { FileOutputStream fout = new FileOutputStream("G://address.ser", true); ObjectOutputStream oos = new ObjectOutputStream(fout); oos.writeObject(MyClassList.get(cnt)); }

Agregué "verdadero" al constructor de outputstream, porque quiero agregar cada objeto al final del archivo. ¿Es eso correcto?

Y aquí está mi código para leer los objetos del archivo:

try { streamIn = new FileInputStream("G://address.ser"); ObjectInputStream objectinputstream = new ObjectInputStream(streamIn); MyClass readCase = (MyClass) objectinputstream.readObject(); recordList.add(readCase); System.out.println(recordList.get(i)); } catch (Exception e) { e.printStackTrace(); }

Finalmente imprime solo un objeto. ¡Ahora, no sé si no estoy escribiendo correctamente o leyendo correctamente!


Como otros sugirieron, puede serializar y deserializar toda la lista a la vez, lo cual es más simple y parece cumplir perfectamente con lo que pretende hacer.

En ese caso, el código de serialización se convierte

ObjectOutputStream oos = null; FileOutputStream fout = null; try{ fout = new FileOutputStream("G://address.ser", true); oos = new ObjectOutputStream(fout); oos.writeObject(myClassList); } catch (Exception ex) { ex.printStackTrace(); } finally { if(oos != null){ oos.close(); } }

Y la deserialización se convierte (suponiendo que myClassList es una lista y esperando que use genéricos):

ObjectInputStream objectinputstream = null; try { FileInputStream streamIn = new FileInputStream("G://address.ser"); objectinputstream = new ObjectInputStream(streamIn); List<MyClass> readCase = (List<MyClass>) objectinputstream.readObject(); recordList.add(readCase); System.out.println(recordList.get(i)); } catch (Exception e) { e.printStackTrace(); } finally { if(objectinputstream != null){ objectinputstream .close(); } }

También puede deserializar varios objetos de un archivo, según lo previsto:

ObjectInputStream objectinputstream = null; try { streamIn = new FileInputStream("G://address.ser"); objectinputstream = new ObjectInputStream(streamIn); MyClass readCase = null; do { readCase = (MyClass) objectinputstream.readObject(); if(readCase != null){ recordList.add(readCase); } } while (readCase != null) System.out.println(recordList.get(i)); } catch (Exception e) { e.printStackTrace(); } finally { if(objectinputstream != null){ objectinputstream .close(); } }

No olvide cerrar los objetos de transmisión en una cláusula finally (nota: puede arrojar una excepción).

EDITAR

Como se sugirió en los comentarios, debería ser preferible usar try con recursos y el código debería ser bastante más simple.

Aquí está la serialización de la lista:

try( FileOutputStream fout = new FileOutputStream("G://address.ser", true); ObjectOutputStream oos = new ObjectOutputStream(fout); ){ oos.writeObject(myClassList); } catch (Exception ex) { ex.printStackTrace(); }


Creo que tienes que escribir cada objeto en un archivo propio o tienes que dividir uno cuando lo lees. También puede tratar de serializar su lista y recuperarla al deserializarla.


Si serializas toda la lista, también debes deserializar el archivo en una lista cuando lo leas. Esto significa que inevitablemente cargará en la memoria un archivo grande. Puede ser costoso Si tiene un archivo grande y necesita dividirlo línea por línea (-> objeto por objeto) simplemente proceda con su idea inicial .

Publicación por entregas:

LinkedList<YourObject> listOfObjects = <something>; try { FileOutputStream file = new FileOutputStream(<filePath>); ObjectOutputStream writer = new ObjectOutputStream(file); for (YourObject obj : listOfObjects) { writer.writeObject(obj); } writer.close(); file.close(); } catch (Exception ex) { System.err.println("failed to write " + filePath + ", "+ ex); }

Deserialización:

try { FileInputStream file = new FileInputStream(<filePath>); ObjectInputStream reader = new ObjectInputStream(file); while (true) { try { YourObject obj = (YourObject)reader.readObject(); System.out.println(obj) } catch (Exception ex) { System.err.println("end of reader file "); break; } } } catch (Exception ex) { System.err.println("failed to read " + filePath + ", "+ ex); }