java.io.NotSerializableException

  Java序列化的實現很簡單,須要序列化的類實現Serializable接口;java

  而後就可使用ObjectOutStream的write()方法輸出;app

  反序列化:使用 ObjectInputStream的read()方法便可輸入;iphone

  序列化和反序列化實現很簡單,可是要注意實現Serializable接口的類中不能有其餘類的實例化對象;ide

  即:若是這個類中還包含別的類的實例,那麼被調用的類也須要實現Serializable接口。this

  下面就是一個我在學序列化時,遇到的麻煩:spa

  嫌麻煩,在Serializable接口的類中實例化了Scanner類的對象,致使運行錯誤;code

  做業需求:對象

應用對象序列化和對象反序列化向文件寫入對象,並將對象讀取出來輸入到控制檯上。blog

效果圖: 繼承

//img.mukewang.com/climg/5af016d50001dc4902330565.jpg

任務要求:

一、建立Product類,並聲明它的屬性:ID,name,categories,price
二、繼承Serializable接口;
三、定義Product類構造方法;
四、在Test類裏面,建立Product類的對象:iphone,ipad,macbook,iwatch
五、實例化對象輸入流和對象輸出流;
六、寫入Product類的四個對象;
七、從文件裏讀取四個product類的四個對象。

 

個人代碼:

 1 import java.io.Serializable;  2 import java.util.Scanner;  3 
 4 public class Apple implements Serializable {  5     private String id;  6     private String name;  7     private String categories;  8     private double price;  9     Scanner sc = new Scanner(System.in); 10     public Apple(String id, String name, String categories, double price) { 11         this.setId(id); 12         this.setName(name); 13         this.setCategories(categories); 14         this.setPrice(price); 15  } 16     public String getId() { 17         return id; 18  } 19     public void setId(String id) { 20         this.id = id; 21  } 22     public String getName() { 23         return name; 24  } 25     public void setName(String name) { 26         this.name = name; 27  } 28     public String getCategories() { 29         return categories; 30  } 31     public void setCategories(String categories) { 32         this.categories = categories; 33  } 34     public double getPrice() { 35         return price; 36  } 37     public void setPrice(double price) { 38         this.price = price; 39  } 40  @Override 41     public String toString() { 42         return "產品ID:" + id + "\n產品名稱:" + name + "\n產品屬性:" + categories + "\n產品價格:" + price+"\n"; 43  } 44     
45 }

 

package com.task8; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; public class FileTest4 { public static void main(String[] args) { try { FileOutputStream fos = new FileOutputStream("apple.txt"); FileInputStream fis = new FileInputStream("apple.txt"); ObjectOutputStream obs = new ObjectOutputStream(fos); ObjectInputStream ois = new ObjectInputStream(fis); obs.writeObject(new Apple("123","iphone","telephone",4888.0)); obs.writeObject(new Apple("234","ipad","computer",5088.0)); obs.writeObject(new Apple("345","macbook","computer",10688.0)); obs.writeObject(new Apple("256","iwatch","watch",4799.0)); System.out.println("apple系列產品信息:"); for(int i = 0;i<4;i++) { try { System.out.println(ois.readObject()); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block
 e.printStackTrace(); } } fos.close(); fis.close(); obs.close(); ois.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block
 e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block
 e.printStackTrace(); } } }

運行結果:

 

 重要的事說三遍:

        實現Serializable接口的類中不能有其餘類的實例化對象;

   實現Serializable接口的類中不能有其餘類的實例化對象;

   實現Serializable接口的類中不能有其餘類的實例化對象;

  即:若是這個類中還包含別的類的實例,那麼被調用的類也須要實現Serializable接口。

相關文章
相關標籤/搜索