java基礎序--列化和反序列化
一、什麽是序列化和反序列化:
序列化:是指把java堆內存中的對象轉換成字節(二進制流)的過程。也就是通過某種方式將java對象存儲在磁盤內存中,這個過程稱為序列化
反序列化:是把磁盤上的對象轉恢復成java對象的過程。
二、序列化和反序列化優點:
1、分布式系統中,需要把對象在網絡傳輸,需要將對象轉換成二進制流形式,需要共享的javabean對象都需要進行序列化。
2、服務器鈍化,服務器發現某些對象好久沒有活動,服務器就會將某些對象存儲在本地內存中,需要的時候去內存中尋找,然後反序列化成java對象,節省服務器內存。
總結:①、實現了數據的持久化,通過序列化保存在本地硬盤上。②、利用序列化實現了遠程通信。
三、序列化的必要條件:
1、需要實現Java.lang.Serializable 接口,java中大多類都實現類改接口。例:String Integer
2、斷層會判斷,當前對象是 Serializable 的實例,才允許做序列化,Java對象 instanceof Serializable 來判斷
3、jdk中的api:
ObjectOutputStream 中的 writeObject() 方法進行序列化操作
ObjectInputStream 中的readObject() 方法進行反序列化操作
javabean 如果不實現 java.io.Serializable 接口
demo:
package com.liuxn.Serialization.javaBean; import java.io.Serializable; /** * Created by Administrator on 2018/6/13. * 創建一個javabean 實現 Serializable 接口 */ public class User implements Serializable { //需要進行序列化的字段 private String name; private int age; transient private String className;//不需要進行序列化的字段 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public String getClassName() { return className; } public void setClassName(String className) { this.className = className; } public void setAge(int age) { this.age = age; } // public User(String name, int age) { // this.name = name; // this.age = age; // } // // // public User() { // } @Override public String toString() { return "User{" + "name=‘" + name + ‘\‘‘ + ", age=" + age + ", className=‘" + className + ‘\‘‘ + ‘}‘; } }
package com.liuxn.Serialization.test; import com.liuxn.Serialization.javaBean.User; import java.io.*; /** * Created by Administrator on 2018/6/13. * * 用於測試序列化和反序列化 測試類 */ public class TestSerialization { public static void main(String[] args) { /** * 使用ObjectOutputStream實現序列化 */ User user = new User(); user.setAge(10); user.setName("小明"); System.out.println(user); ObjectOutputStream oos = null; try { OutputStream op = new FileOutputStream("F:\\360WiFi"+ File.separator+"a.txt"); oos = new ObjectOutputStream(op); oos.writeObject(user); oos.close(); } catch (IOException e) { e.printStackTrace(); } /** * ObjectInputStream 實現反序列化 */ try { InputStream in = new FileInputStream("F:\\360WiFi"+ File.separator+"a.txt"); ObjectInputStream os = new ObjectInputStream(in); byte[] buffer = new byte[10]; int len = -1; User u = (User) os.readObject(); System.out.println("反序列化:"); System.out.println(u); os.close(); }catch (Exception e){ e.printStackTrace(); } } }
//輸出結果: User{name=‘小明‘, age=10} 反序列化:User{name=‘小明‘, age=10}
在序列化時,如果javabean完成序列化後,修改javabean,在次進行反序列化會出現以下問題:
解決:
在javabean中條添加 serialVersionUID 固定版本。
private static final long serialVersionUID = 1L;
javabean
java基礎序--列化和反序列化