Java - 序列化 - NotSerializableException问题

Jux*_*hin 0 java io serialization

我目前正在使用仅使用Java的学生数据库,并且有两个我想保存的特定列表.学生和个人资料(登录).我目前正在测试学生的序列化只是为了让它工作,但一直有一个奇怪的问题.


我的Student对象类和代码如下:

Student.java

StudentsCollection.java

学生创建我的Student对象(自解释),我的StudentsCollection()实例化一个存储我的Student对象的Student类型列表,当我尝试保存/加载我使用此代码的对象时,抛出以下异常:

    /**
     * Save student collection
     */
   public void saveCollection(){
      try {
         FileOutputStream e = new FileOutputStream("students.ser");
         ObjectOutputStream outputStream = new ObjectOutputStream(e);
         for(Students i : this.list){
             outputStream.writeObject(i);
         }
         outputStream.flush();
         outputStream.close();
      } catch (IOException var3) {
          var3.printStackTrace();
         JOptionPane.showMessageDialog((Component)null, "Error. Cannot save database.");
      }

   }

    /**
     * Open student collection
     */
   public void openCollection(){
      try {
         FileInputStream e = new FileInputStream("students.ser");
         ObjectInputStream inputSteam = new ObjectInputStream(e);
          while(inputSteam.readObject() != null){
              this.list.add((Students)inputSteam.readObject());
          }
      } catch (FileNotFoundException var3) {
          var3.printStackTrace();
         JOptionPane.showMessageDialog(null, "File not found");
      } catch (IOException var4) {
          var4.printStackTrace();
         JOptionPane.showMessageDialog(null, "IO Exception");
      } catch (ClassNotFoundException var5) {
          var5.printStackTrace();
         JOptionPane.showMessageDialog(null, "Required class not found");
      }

   }
Run Code Online (Sandbox Code Playgroud)

并打印以下异常:

java.io.NotSerializableException: java.util.Scanner
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1183)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1547)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1508)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)
at jdatabase.objects.students.StudentsCollection.saveCollection(StudentsCollection.java:539)
at jdatabase.main.MainController$1.run(MainController.java:22)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:312)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:733)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:694)
at java.awt.EventQueue$3.run(EventQueue.java:692)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:703)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
Run Code Online (Sandbox Code Playgroud)

我还想指出,students.ser实际上是在我的项目资源管理器中创建的,但是异常仍然被抛出,即使在尝试使用openCollection()时也会抛出错误,但是我想首先正确处理saveCollection()

xia*_*.li 5

你没有发布你的Student.java,所以我猜这里.有类型的字段java.util.ScannerStudent类?如果有,请删除它,或将其标记为transient:

private transient Scanner someField;
Run Code Online (Sandbox Code Playgroud)

transient修改将防止序列化的领域.