Serializable

1. 序列化和反序列化java

將對象轉換爲字節序列的過程稱爲對象的序列化。 反過來,將字節序列恢復成對象的過程稱爲對象的反序列化。數據庫

2. 爲何要用序列化緩存

2.1當咱們須要將內存中的對象存儲到一個文件\數據庫中的時候 一般咱們須要將某些對象進行序列化,讓它離開內存空間,入駐物理硬盤,以便長期保存,須要的時候在調取它。例如:緩存,咱們須要將緩存存儲起來,須要的時候再將它取出來。 2.2須要在網絡上傳送對象的時候 當兩個進程在進行遠程通訊時,彼此時間須要發送數據,不管哪一種類型的數據,都會以二進制序列的形式在網絡上傳送。網絡

3. 實例app

3.1建立User對象並實現Serializable接口測試

public class User implements Serializable{

	/** 序列ID */
	private static final long serialVersionUID = 8364239647574512618L;

	private Integer id;
	
	private String name;

3.2寫測試代碼this

package test;

import java.io.File;
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 org.junit.Test;
import model.User;


public class TestUserSerializable {

	@Test
	public void test() throws InstantiationException, IllegalAccessException {
		//序列化
		this.UserSerializable();
		//反序列化
		User user=this.UnUserSerialiable();
		System.out.println(user);
	}
	
	
	/**
	 * 序列化User對象
	 * 
	 * 1.經過反射建立對象
	 * 
	 * 2.建立對象輸出流,調用writeObject(Object obj)方法
	 * 
	 * @throws InstantiationException
	 * @throws IllegalAccessException
	 */
	public void UserSerializable() throws InstantiationException,IllegalAccessException{

		User user=new User();
		try {
			//經過反射建立User對象
			Class<?> clazz=Class.forName("model.User");
			user=(User) clazz.newInstance();
			user.setId(1);
			user.setName("張三");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		ObjectOutputStream oos=null;
		try {
			StringBuffer path=new StringBuffer();
			String str="E:\\Test\\";
			File file=new File(str);
			if (!file.exists()) {
				file.mkdirs();
			}
			path=path.append(str).append("User.txt");
			//建立對象輸出流
			//將序列化的user存入E:\Test\User.txt
			oos=new ObjectOutputStream(new FileOutputStream(path.toString()));
			oos.writeObject(user);
			System.out.println("對象序列化成功!");
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			try {
				oos.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	
	public User UnUserSerialiable() throws InstantiationException,IllegalAccessException{
		
		User user=new User();
		ObjectInputStream ois=null;
		try {
			//反序列化
			ois=new ObjectInputStream(new FileInputStream(new File("E:\\Test\\User.txt")));
			try {
				user=(User) ois.readObject();
				System.out.println("反序列化成功!");
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return user;
		
	}
}

測試結果

4. serialVersionUID的做用code

Java的序列化機制是經過在運行時判斷類的serialVersionUID來驗證版本一致性的。在進行反序列化時,JVM會把傳來的字節流中的serialVersionUID與本地相應實體(類)的serialVersionUID進行比較,若是相同就認爲是一致的,能夠進行反序列化,不然就會出現序列化版本不一致的異常。對象

4.1經過Test單獨測試UserSerializable(註釋serialVersionUID)接口

輸入圖片說明 輸入圖片說明

4.2修改User屬性,這時再反序列化

增長age屬性 測試結果

相關文章
相關標籤/搜索