序列化和反序列化

(一)序列化  ObjectOutputStream

1.序列化

把對象以數據流的形式存儲在介質上的過程就是序列化,對象不會隨着虛擬機或者程序退出而消失掉


2.結構

java.lang.Object

  繼承者 java.io.OutputStream

      繼承者 java.io.ObjectOutputStream


3.構造方法

new ObjectOutputStream(OutputStream out) 

OutputStream out : 使用的是字節流

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");
	}
	
}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章