al serializar, se sobreescriben los objetos, como puedo solucionarlo?

Iniciado por Kenkox, 27 Agosto 2012, 18:54 PM

0 Miembros y 1 Visitante están viendo este tema.

Kenkox

Aqui hay 4 clases, una clase se llama StudentsRegister, la cual implementa a la interfaz Serializable, tiene 3 variables de instancia con sus respectivos metodos get y set.... esa clase la he revisado, y esta perfectamente echa.
La siguiente clase se llama DesSer, la cual ayuda a serializar y deserializar en el archivo... tiene un metodo que se llama setList.. la cual llama al metodo writeObject(); para escribir la lista que se recibe  en el archivo.. ademas tiene un metodo llamado getList, la cual regresa un ArrayList<StudentsRegister> ( este metodo desserializa el archivo, y utiliza al metodo readObject
..
despues esta la clase ABC.. esta clase esta incompleta, no puedo completarla ya que tengo un problema con las altas ( agregar alumnos a un arrayList y escribirlo en un archivo )
La clase ABC tiene al metodo addStudents... primero pido cuantos alumnos se van a agregar, y despues , estos datos se utilizan para inicializar cada miembro del  array register, al momento de inicializarlos los agrega al arrayList..... al momento de que se introdujeron todos los datos de los estudiantes, se llama al metodo setList de la clase DesSer para escribir esta lista en el archivo.... este proceso esta bien.. o por lo menos no he notado ningun error... incluso en el metodo setList puse un println para poner si se han guardado los datos... y si aparece...

despues esta la clase TestABC... el cual contiene el metodo principal.. creamos un objeto ABC... y llamamos al metodo addStudents y al metodo showStudents.... TOODO sucede correctamente, me pide el numero de los alumnos, yo introdusco los datos de los alumnos, y los escribe en el archivo... sin embargo, el problema radica al volver a ejecutar TestABC, por segunda vez introdusco  alumnos nuevos ..  dice que los escribio, despues me muestra los alumnos pero SOLO me muestra a los alumnos que acababa de agregar y NO los que ya habia agregado en la primera ejecucion.. trate de solucionarlo modificando al metodo getList.. pero sigue sobreescribiendolos...

Alguien podria decirme porque sucede esto? y como podria solucionarlo?? osea, que al momento de que llame al metodo showStudents, me muestre a todos los alumnos( objetos ) que ya he agregada anteriormente

De antemano, Gracias

Código (java) [Seleccionar]
package abc;

import java.io.IOException;

/**
*
* @author Kenkox
*/
public class TestABC {
   public static void main( String args[] ) throws IOException{
      ABC proyect = new ABC();
      proyect.addStudents();
      proyect.showStudents();

   }
}

Código (java) [Seleccionar]
package abc;
/**
*
* @author Kenkox
*/
import java.io.IOException;
import java.util.*;
public class ABC {

    /**
     * @param args the command line arguments
     */

private static List<StudentsRegister> studentList = new ArrayList<>();
private static StudentsRegister register[];
    private DesSer working = new DesSer();
private Scanner keyboard = new Scanner( System.in );
private String firstName;
private String surname;
private double mark;
private int option;

public void addStudents(){
System.out.println("Insert the number of Students to add ");
final int TOTAL_STUDENTS = keyboard.nextInt();
register = new StudentsRegister[TOTAL_STUDENTS];
for( int i=0; i < register.length; i++ ){
System.out.printf("%s\n%s", "write the name, surname and the mark of the student.", ":? " );
firstName = keyboard.next();
surname = keyboard.next();
mark = keyboard.nextDouble();
register[i] = new StudentsRegister(firstName, surname, mark );
                studentList.add(register[i]);
}
            working.setList( studentList );
}
   
public void consultar(){

}

public void eliminarAlumnos(){

}

public void modificarAlumnos(){

}
public void showStudents() throws IOException{
updateList();
System.out.printf("%-10s%-15s%-15s%11s\n ","Num. List", "Name", "Surname", "Mark");
for( int i= 0; i < studentList.size(); i++ )
System.out.printf("%-10d%s\n",i + 1, studentList.get(i));
}
public void updateList() throws IOException{
studentList = ( ArrayList<StudentsRegister> ) working.getList();
}

}

Código (java) [Seleccionar]
package abc;
/**
*
* @author Kenkox
*/
import java.io.Serializable;
public class StudentsRegister implements Serializable{
    private String name;
private String surname;
private double mark;
public StudentsRegister(){
this( "", "", 0.0 );
}
public StudentsRegister( String name, String sur, double mk ){
setName( name );
setSurname( sur );
setMark( mk );
}
public void setName( String nm){
name = nm;
}
public String getName(){
return name;
}
public void setSurname( String sur){
surname = sur;
}
public String getSurname(){
return surname;
}
public void setMark( double mk ){
mark  = mk;
}
public double getMark(){
return mark;
}

public String toString(){
return String.format("%-15s%-15s%11.2f\n ", getName(),
getSurname(), getMark());
}
}

Código (java) [Seleccionar]
package abc;


/**
*
* @author Kenkox
*/
import java.io.*;
import java.util.*;
public class DesSer {
   
private ObjectOutputStream output;
private ObjectInputStream input;
private String fileName = "StudentsRegister.ser";
    private List<StudentsRegister> temporalList = new ArrayList<>();
    private List<StudentsRegister> temporalList2 = new ArrayList<>();


public void openFileSerialize(){
try{
output = new ObjectOutputStream( new FileOutputStream( fileName ));

}

catch( Exception e ){
System.out.printf("there was an error opening the File: \" %s \" \n ", fileName );
}
}

public void openFileDeserialize(){
try{
input = new ObjectInputStream( new FileInputStream( fileName ) );
}
catch( Exception e ){
System.out.printf("there was en error using the File: \" %s \" \n ", fileName );
}
}

public void setList( Collection<StudentsRegister> registerList ){
try{
openFileSerialize();
output.writeObject( registerList );
            System.out.println("Datos Guardados");
}

catch( Exception e){
System.err.println("Can't write or close the File");
System.exit( 1 );
}
}

public Collection<StudentsRegister> getList() throws IOException{
try{
openFileDeserialize();
            while(true){
              temporalList = ( ArrayList<StudentsRegister> ) input.readObject();
              temporalList2.addAll(temporalList);
            }
}
        catch(EOFException endOfFileException){
         input.close();
         return temporalList2;
        }
catch( IOException | ClassNotFoundException e ){
System.out.println("there was an error reading the file");
System.exit( 1 );
}
      return null;

}
}

4nc3str4l

El problema reside aqui: ya que cuando haces un addstudents el empieza desde i =0 i va guardando estudiantes en la posicion 0, 1, 2 ,3 ,4 y cuando vuelves a invocar el metodo pues vuelve a 0 y empieza a guardar desde 0,1,2,3,4.... asi que los sobreescribe, Creo que la cuestión sería guardar la variable i para que continue desde donde lo dejo en el primer registro de alumnos.
public void addStudents(){
System.out.println("Insert the number of Students to add ");
final int TOTAL_STUDENTS = keyboard.nextInt();
register = new StudentsRegister[TOTAL_STUDENTS];
for( int i=0; i < register.length; i++ ){
System.out.printf("%s\n%s", "write the name, surname and the mark of the student.", ":? " );
firstName = keyboard.next();
surname = keyboard.next();
mark = keyboard.nextDouble();
register[i] = new StudentsRegister(firstName, surname, mark );
                studentList.add(register[i]);
}
            working.setList( studentList );
}
# "Saber romper medidas de seguridad no hacen que seas hacker, al igual que saber hacer un puente en un coche no te convierte en un ingeniero de automoción"
-- Eric Raymond

4nc3str4l

Mira yo haria la siguiente modificacion en el addstudents para guardar una variable contador para que no me sobreescriba los estudiantes:

public void addStudents(){
System.out.println("Insert the number of Students to add ");
final int TOTAL_STUDENTS = keyboard.nextInt();
register = new StudentsRegister[TOTAL_STUDENTS];
                        //creamos un contador
                        int cont=0;
                        //Nuestro contador ira mirando que posiciones de la array estan llenas para que el for no sobreescriba.
                        while(register[cont]!=null){
                            cont++;
                        }
                        //El for empezará desde donde le ha marcado el contador asi no sobreescribirá
for( int i=cont; i < register.length; i++ ){
System.out.printf("%s\n%s", "write the name, surname and the mark of the student.", ":? " );
firstName = keyboard.next();
surname = keyboard.next();
mark = keyboard.nextDouble();
register[i] = new StudentsRegister(firstName, surname, mark );
                studentList.add(register[i]);
}
            working.setList( studentList );
}


Creo que con eso ya esta listo tu problema. ;)
# "Saber romper medidas de seguridad no hacen que seas hacker, al igual que saber hacer un puente en un coche no te convierte en un ingeniero de automoción"
-- Eric Raymond