(一)序列化 ObjectOutputStreamjava
1.序列化ide
把對象以數據流的形式存儲在介質上的過程就是序列化,對象不會隨着虛擬機或者程序退出而消失掉this
2.結構spa
java.lang.Object對象
繼承者 java.io.OutputStream繼承
繼承者 java.io.ObjectOutputStream接口
3.構造方法get
new ObjectOutputStream(OutputStream out) 虛擬機
OutputStream out : 使用的是字節流it
new ObjectOutputStream(new FileOutputStream("E:/obj.txt"));
4.方法
writeObject(Object obj) 將指定的對象寫入 ObjectOutputStream
5.實際使用
(1)若是想序列化User類對象,那麼User類必須實現"序列化接口(Serializable)"
(2)給類生成一個指定的序列化版本ID,若是這個類的內容發生了變化,不會影響反序列化
private static final long serialVersionUID = -4743372914435189725L;
(3)多個User對象寫入ArrayList集合中,再執行序列化,ArrayList也實現了Serializable接口
(二)反序列化 ObjectInputStream
1.反序列化
ObjectInputStream 對之前使用 ObjectOutputStream 寫入的基本數據和對象進行反序列化
2.結構
java.lang.Object
繼承者 java.io.InputStream
繼承者 java.io.ObjectInputStream
3.構造方法
new ObjectInputStream(InputStream in)建立從指定 InputStream 讀取的 ObjectInputStream。
InputStream in : 使用的是字節流
new ObjectInputStream(new FileInputStream("E:/obj.txt"));
4.方法
readObject() 從 ObjectInputStream 讀取對象==》返回 Object
5.實際使用
反序列化User類對象,若是User類(修改原有內容)新加個方法,那麼反序列化時的序列號(版本號)跟以前序列化時的版本號對應不上,就沒法反序列化
代碼1:User類
import java.io.Serializable; public class User implements Serializable{ /** * 給類生成一個指定的序列化版本ID,若是這個類的內容發生了變化,不會影響反序列化 */ private static final long serialVersionUID = -4743372914435189725L; private String name; private int age ; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
代碼2:單個User對象序列化
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class Main_ObjectOutputStream { public static void main(String[] args) { writeObject(); readObject(); } // 單個User對象序列化 public static void writeObject() { ObjectOutputStream oos=null; try { oos=new ObjectOutputStream(new FileOutputStream("E:/obj.txt")); User user=new User(); user.setName("www"); user.setAge(20); oos.writeObject(user); /** * 文件寫入內容 * ooxxnulloppxxxj <瞎寫和亂碼由於這裏的文件不須要咱們去讀懂> * */ } catch (FileNotFoundException e) { System.out.println("【異常】未找到文件"); e.printStackTrace(); } catch (IOException e) { System.out.println("【異常】IO出錯"); e.printStackTrace(); } finally { if(oos!=null) { try { oos.close(); } catch (IOException e) { e.printStackTrace(); } } } System.out.println("end"); } public static void readObject() { ObjectInputStream ois=null; try { ois=new ObjectInputStream(new FileInputStream("E:/obj.txt")); Object obj=ois.readObject(); User user=(User) obj; String name=user.getName(); int age =user.getAge() ; System.out.println(name+":"+age); /** * 輸出內容 : * www:20 * */ } catch (FileNotFoundException e) { System.out.println("【異常】未找到文件"); e.printStackTrace(); } catch (IOException e) { System.out.println("【異常】IO出錯"); e.printStackTrace(); } catch (ClassNotFoundException e) { System.out.println("【異常】未找到類異常"); e.printStackTrace(); } finally { if(ois!=null) { try { ois.close(); } catch (IOException e) { e.printStackTrace(); } } } System.out.println("end"); } }
代碼3:多個User對象寫入集合中,再執行序列化
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.util.ArrayList; public class Main_ObjectOutputStream_ArrayList { public static void main(String[] args) { writeObject(); readObject(); } // 多個User對象寫入集合中,再執行序列化 public static void writeObject() { ObjectOutputStream oos=null; try { oos=new ObjectOutputStream(new FileOutputStream("E:/obj_list.txt")); User user1=new User(); user1.setName("www"); user1.setAge(20); User user2=new User(); user2.setName("yyy"); user2.setAge(30); ArrayList<User> list=new ArrayList<User>(); list.add(user1); list.add(user2); oos.writeObject(list); /** * 文件寫入內容 * ooxxnulloppxxxj <瞎寫和亂碼由於這裏的文件不須要咱們去讀懂> * */ } catch (FileNotFoundException e) { System.out.println("【異常】未找到文件"); e.printStackTrace(); } catch (IOException e) { System.out.println("【異常】IO出錯"); e.printStackTrace(); } finally { if(oos!=null) { try { oos.close(); } catch (IOException e) { e.printStackTrace(); } } } System.out.println("end"); } public static void readObject() { ObjectInputStream ois=null; try { ois=new ObjectInputStream(new FileInputStream("E:/obj_list.txt")); Object obj=ois.readObject(); ArrayList<User> list=(ArrayList<User>) obj; for(User u:list) { System.out.println(u.getName()+":"+u.getAge()); //輸出內容 //www:20 //yyy:30 } } catch (FileNotFoundException e) { System.out.println("【異常】未找到文件"); e.printStackTrace(); } catch (IOException e) { System.out.println("【異常】IO出錯"); e.printStackTrace(); } catch (ClassNotFoundException e) { System.out.println("【異常】未找到類異常"); e.printStackTrace(); } finally { if(ois!=null) { try { ois.close(); } catch (IOException e) { e.printStackTrace(); } } } System.out.println("end"); } }