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屬性,這時再反序列化