2012-10-18 12 views
29

Dopo aver scritto il codice qui sotto, ora devo usare i metodi di sovrascrittura personalizzati readObject() e writeObject() in StudentData per leggere e scrivere le variabili dell'oggetto. Senza usare i metodi defaultWriteObject o defaultReadObject per fare ciò.- override writeObject readObject

Il guaio è che non capisco pienamente ciò che mi viene chiesto di fare. Ho letto Uses of readObject/writeObject in Serialization ma non riesco a capirlo. Qualcuno mi indica la giusta direzione?

Il mio codice:

import java.io.*; //importing input-output files 

class Student implements java.io.Serializable { 

    String name; // declaration of variables 
    String DOB; 
    int id; 

    Student(String naam, int idno, String dob) // Initialising variables to user 
               // data 
    { 
     name = naam; 
     id = idno; 
     DOB = dob; 
    } 

    public String toString() { 
     return name + "\t" + id + "\t" + DOB + "\t"; 
    } 

} 
import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 

class StudentData      //main class 
{ 
    public static void main(String args[]) throws IOException     //exception handling 
    { 
     System.out.println("Enter the numbers of students:"); 
     BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
     int n = Integer.parseInt(in.readLine()); 

     Student[] students = new Student[n]; 

     //Student[] S=new Student[n];      // array of objects declared and defined 
     for (int i = 0; i < students.length; i++) { 
      System.out.println("Enter the Details of Student no: " + (i + 1));    //reading data form the user 
      System.out.println("Name: "); 
      String naam = in.readLine(); 
      System.out.println("ID no: "); 
      int idno = Integer.parseInt(in.readLine()); 
      System.out.println("DOB: ");    
      String dob = (in.readLine()); 

      students[i] = new Student(naam, idno, dob);       

      File studentFile = new File("StudentData.txt"); 
      try { 
       FileOutputStream fileOutput = new FileOutputStream(studentFile); 
       ObjectOutputStream objectOutput = new ObjectOutputStream(fileOutput); 
       objectOutput.writeObject(students); 

       students = null; 

       FileInputStream fileInput = new FileInputStream(studentFile); 
       ObjectInputStream objectInputStream = new ObjectInputStream(fileInput); 

       students = (Student[]) objectInputStream.readObject(); 
      } catch (ClassNotFoundException e) { 
       e.printStackTrace(); 
      } 

      for (Student student : students) { 
       System.out.println(student); 
      } 
     } 
    } 
} 
+0

Assegnazione strana. * Si suppone * di chiamare defaultWriteObject() e defaultReadObject(). – EJP

risposta

49

Devi fare in questo modo:

import java.io.IOException; 

class Student implements java.io.Serializable { 

    String name; 
    String DOB; 
    int id; 

    Student(String naam, int idno, String dob) { 
     name = naam; 
     id = idno; 
     DOB = dob; 
    } 

    private void writeObject(java.io.ObjectOutputStream stream) 
      throws IOException { 
     stream.writeObject(name); 
     stream.writeInt(id); 
     stream.writeObject(DOB); 
    } 

    private void readObject(java.io.ObjectInputStream stream) 
      throws IOException, ClassNotFoundException { 
     name = (String) stream.readObject(); 
     id = stream.readInt(); 
     DOB = (String) stream.readObject(); 
    } 

    public String toString() { 
     return name + "\t" + id + "\t" + DOB + "\t"; 
    } 

} 

I metodi readObject viene richiamato subito dopo la creazione di un'istanza di Student (scavalcando il normale costruttore).

+7

Basta indicare un dettaglio lì. L'ordine o la scrittura/lettura ** è ** importante. Nell'esempio la scrittura è: nome, id, DOB in modo da ottenere nome, id, DOB quando si legge – Manu

+3

Funzionerà senza un costruttore vuoto? – borjab