2014-02-18 5 views
1

У меня есть этот код, который записывает объект:Java Сериализация вопросы

FileOutputStream fileOut = new FileOutputStream("Model.ser"); 
ObjectOutputStream out = new ObjectOutputStream(fileOut); 
out.writeObject(this); 
out.close(); 
fileOut.close(); 

И этот код, который загружает объект:

Model m = null; 
try { 
    FileInputStream fileIn = new FileInputStream("Model.ser"); 
    ObjectInputStream in = new ObjectInputStream(fileIn); 
    m = (Model) in.readObject(); 
    in.close(); 
    fileIn.close(); 
} catch (Exception e) {} 

setStudentList(m.getStudentList()); 
setModuleList(m.getModuleList()); 

Я уверен, что сохранение работы, как и когда я открыл файл в блокноте ++. Я видел большую часть данных, которые я сохранил, но когда я загружаю, в списке модулей нет данных.

Полный исходный код:

import java.io.*; 
import java.util.*; 

public class Model implements java.io.Serializable { 

private Student[] studentList = new Student[0]; 
private Module[] moduleList = new Module[0]; 

public void menu() { 
    while (true) { 
     System.out.println ("MENU"); 
     System.out.println (""); 
     System.out.println (" 1 - Run Tests"); 
     System.out.println (" 2 - Add Student"); 
     System.out.println (" 3 - Add Module"); 
     System.out.println (" 4 - Add Student To Module"); 
     System.out.println (" 5 - Save System (Text file)"); 
     System.out.println (" 6 - Load System (Text file)"); 
     System.out.println (" 7 - Save System (Serialized)"); 
     System.out.println (" 8 - Load System (Serialized)"); 
     System.out.println (" 9 - Print Report"); 
     System.out.println (""); 
     System.out.print ("Enter choice: "); 

     String input = keyboard.readString(); 

     switch (input) { 
      case "1" : 
       runTests(); 
       break; 
      case "2" : 
       System.out.print("First Name : "); 
       String fN = keyboard.readString(); 
       System.out.print("Surname : "); 
       String sN = keyboard.readString(); 
       System.out.print("Course Code : "); 
       String c = keyboard.readString(); 
       System.out.print("User ID : "); 
       String iD = keyboard.readString(); 
       AddStudent(iD, sN, fN, c); 
       break; 

      case "3" : 
       System.out.print("Module Code : "); 
       String code = keyboard.readString(); 
       String[] temp = new String[0]; 
       AddModule(code,temp); 
       break; 
      case "4" : 
       System.out.print("Module Code : "); 
       code = keyboard.readString(); 
       Module m = findAModule(code); 
       if (m != null) { 
        System.out.print("User ID : "); 
        iD = keyboard.readString(); 
        Student s = findAStudent(iD); 
        if (s != null) { 
         m.addThisStudent(s); 
        } else { 
         System.out.println("Student not found"); 
        } 
       } else { 
        System.out.println("Module not found"); 
       } 
       break; 
      case "5" : 
       saveToTextFiles(); 
       break; 
      case "6" : 
       loadFromTextFiles(); 
       break; 
      case "7" : 
       saveSerialized(); 
       break; 
      case "8" : 

       break; 
      case "9" : 
       printReport(); 
       break;     
     } 
    } 
} 

public void runTests() { 
    loadFromTextFiles(); 
    saveSerialized(); 
    printReport(); 
} 

public void loadFromTextFiles() { 
    studentList = new Student[0]; 
    moduleList = new Module[0]; 
    try { 
     Scanner fileReader = new Scanner(new InputStreamReader(new FileInputStream("students.txt"))); 
     int num = fileReader.nextInt(); fileReader.nextLine(); 
     for (int i = 0; i < num; i++) { 
      String u = fileReader.nextLine(); 
      String sn = fileReader.nextLine(); 
      String fn = fileReader.nextLine(); 
      String c = fileReader.nextLine(); 
      AddStudent(u, sn, fn, c); 
     } 
     fileReader.close(); 

     fileReader = new Scanner(new InputStreamReader(new FileInputStream("modules.txt"))); 
     num = fileReader.nextInt(); fileReader.nextLine(); 
     for (int i = 0; i < num; i++) { 
      String code = fileReader.nextLine(); 
      int numOfStudents = fileReader.nextInt(); fileReader.nextLine(); 
      String[] students = new String[numOfStudents]; 
      for (int j = 0; j < numOfStudents; j++) { 
       students[j] = fileReader.nextLine(); 
      } 
      AddModule(code, students); 
     } 
     fileReader.close(); 
    } catch (IOException e) {} 

} 

public void saveToTextFiles() { 
    try { 
     PrintWriter outfile = new PrintWriter(new OutputStreamWriter (new FileOutputStream("students.txt"))); 
     outfile.println(studentList.length); 
     for (int i = 0; i < studentList.length; i++) { 
      outfile.println(studentList[i].getUID()); 
      outfile.println(studentList[i].getSN()); 
      outfile.println(studentList[i].getFN()); 
      outfile.println(studentList[i].getDegree()); 
     } 
     outfile.close(); 

     outfile = new PrintWriter(new OutputStreamWriter (new FileOutputStream("modules.txt"))); 
     outfile.println(moduleList.length); 
     for (int i = 0; i < moduleList.length; i++) { 
      outfile.println(moduleList[i].getCode()); 
      outfile.println(moduleList[i].getStudents().length); 
      for (int j = 0; j < moduleList[i].getStudents().length; j++) { 
       outfile.println(moduleList[i].getStudents()[j]); 
      } 
     } 
     outfile.close(); 
    } catch (IOException e) {} 
} 

public void saveSerialized() { 
    try { 
     FileOutputStream fileOut = new FileOutputStream("Model.ser"); 
     ObjectOutputStream out = new ObjectOutputStream(fileOut); 
     out.writeObject(this); 
     out.close(); 
     fileOut.close(); 

     FileOutputStream fileOut2 = new FileOutputStream("Module.ser"); 
     ObjectOutputStream out2 = new ObjectOutputStream(fileOut2); 
     out2.writeObject(studentList); 
     out2.close(); 
     fileOut2.close(); 

     FileOutputStream fileOut3 = new FileOutputStream("Student.ser"); 
     ObjectOutputStream out3 = new ObjectOutputStream(fileOut3); 
     out3.writeObject(moduleList); 
     out3.close(); 
     fileOut3.close(); 
    } catch (IOException e) {} 
} 

public void loadSerialized() { 
    Model m = null; 
    try { 
     FileInputStream fileIn = new FileInputStream("Model.ser"); 
     ObjectInputStream in = new ObjectInputStream(fileIn); 
     m = (Model) in.readObject(); 
     in.close(); 
     fileIn.close(); 
    } catch (Exception e) {} 

    setStudentList(m.getStudentList()); 
    setModuleList(m.getModuleList()); 
} 

private Module[] getModuleList() { 
    return moduleList; 
} 

private Student[] getStudentList() { 
    return studentList; 
} 

private void setModuleList(Module[] m) { 
    moduleList = m.clone(); 
} 

private void setStudentList(Student[] s) { 
    studentList = s.clone(); 
} 

private void AddModule(String code, String[] students) { 
    int length = moduleList.length; 
    Module NewArray[] = new Module[length + 1]; 
    for (int i = 0; i < length + 1; i++) { 
     if (i < length) { 
      NewArray[i] = new Module(moduleList[i]); 
     } 
    } 
    NewArray[length] = new Module(code, students); 
    moduleList = NewArray.clone(); 
} 

private void AddStudent(String u, String sn, String fn, String c) { 
    int length = studentList.length; 
    Student NewArray[] = new Student[length + 1]; 
    for(int i = 0; i < length + 1; i++) { 
     if (i < length) { 
      NewArray[i] = new Student(studentList[i]); 
     } 
    } 
    NewArray[length] = new Student(u, sn, fn, c); 
    studentList = NewArray.clone(); 
} 

public void printReport() { 
    for (int i = 0; i < moduleList.length; i++) { 
     System.out.println(moduleList[i].toString(this)); 
    } 
} 

public Student findAStudent(String uid) { 
    for (int i = 0; i < studentList.length; i++) { 
     if (studentList[i].getUID().compareTo(uid) == 0) { 
      return studentList[i]; 
     } 
    } 
    return null; 
} 

public Module findAModule(String code) { 
    for (int i = 0; i < moduleList.length; i++) { 
     if (moduleList[i].getCode().compareTo(code) == 0) { 
      return moduleList[i]; 
     } 
    } 
    return null; 
} 
} 
+0

Сообщения полного исходного код класса модели , – RaviH

+0

Пожалуйста, объясните, что такое «проблемы» –

+0

Проблемы в том, что если я сохраню некоторые данные с помощью 'saveSerialized()' Я не могу вернуть данные с помощью 'loadSerialized()' –

ответ

1

Посмотрите на свой образец кода, в частности, переключатель заявление:

switch (input) { 

    ... 

    case "8" : 

     break; 

    ... 

} 

Я бы предположить, метод loadSerialized следует назвать там, но он отсутствует и не вызывается нигде в коде.

Как только вы на самом деле называете метод загрузки, код будет работать, если вы объявили serialVersionUID как для Student, так и для Module.

Edit: почему использование сериализации для сохранения объектов является плохой идеей

Проще говоря, используя сериализацию сохранения объектов является хрупким.

Сериализованная форма объекта привязана к его классу. Классы, как правило, меняются со временем, то есть сериализованный экземпляр старого не может быть загружен в новый.

В то время как вы можете обойти это, установив serialVersionUID, это приводит к обратному решению проблемы, когда в случае ввода новых полей новое не может быть прочитано в объекты старого класса, что может быть проблемой, если вы загружаете обновления в развернутую систему.

Там есть множество других причин - это не так легко читаемые (то есть вы не можете обновить его, как вы бы базу данных или XML/JSON документ), это неэффективно, и т.д.

+0

FWIW, serialVersionUID не является абсолютно необходимым. serialVersionUID как публичные защитники. Если вы не предоставите один, вам будет предоставлен, он может быть не таким, каким вы хотите. – jsight

+1

Да, но предоставленный 'serialVersionUID' может меняться, когда класс [re] скомпилирован, поэтому, если вы собираетесь использовать сериализацию для сохранения объектов (что является плохой идеей в первую очередь), лучше всего быть в безопасности и добавить один. –

+0

О, ничего себе, я не уверен, как я пропустил это, спасибо! Я читал, как использовать сериализацию для настойчивости, почему это плохо? –

Смежные вопросы