1.概念
Java的“对象序列化”能将一个实现了Serializable接口的对象转换成一组byte,这样日后要用这个对象的时候,能把这些byte数据恢复出来,并据此重新构建那个对象。
对象序列化能实现“轻量级persistence(lightweight persistence)”。所谓persistence,是指对象的生命周期不是由程序是否运行决定的,在程序的两次调用之间对象仍然还活着。通过“将做过序列化处理的对象写入磁盘,等到程序再次运行的时候再把它读出来”,可以达到persistence的效果。
之所以要在语言里加入对象序列化,是因为要用它来实现两个重要的功能:
1.Java的远程方法调用能像调用自己机器上的对象那样去调用其它机器上的对象。
2.对JavaBean来说,Bean的状态信息通常是在设计时配置的,这些状态信息必须保存起来,供程序启动的时候用,对象序列化就负责这个工作。
对象序列化不仅能保存对象的副本,而且还会跟着对象中的reference把它所引用的对象也保存起来,然后再继续跟踪那些对象的reference。
2.实现序列化
(1)序列化一个对象只要让它实现Serializable接口就行了(这是一个“标记接口”,tagging interface,没有任何方法)。
(2)要想序列化对象,必须先创建一个OutputStream,然后把它嵌进ObjectOutputStream。这是就能用writeObject()方法把对象写入OutputStream。
(3)读的时候需要把InputStream嵌到ObjectInputStream中,然后再调用readObject()方法。
3.样例
1 package Entity; 2 3 import java.io.Serializable; 4 5 public class Employee implements Serializable{ 6 7 /* 8 * serialVersionUID作用: 9 * 序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。 10 * 如果你的类Serialized存到硬盘上面后,可是后来你却更改了类别的field(增加或减少或改名), 11 * 当你Deserialize时,就会出现Exception的,这样就会造成不兼容性的问题。 12 * 但当serialVersionUID相同时,它就会将不一样的field以type的预设值Deserialize,这个可以避开不兼容性的问题。 13 */ 14 private static final long serialVersionUID = -5167690587890199758L; 15 16 public String name; 17 public String address; 18 public transient int SSN; 19 public int number; 20 public Department department; 21 22 public String toString() { 23 return "Employee [name=" + name + ", address=" + address + ", number=" + number + "]"; 24 } 25 26 }
Employee.java
1 package Entity; 2 3 import java.io.Serializable; 4 5 public class Department implements Serializable{ 6 private static final long serialVersionUID = -6913084898834515327L; 7 8 public int id; 9 public String name; 10 11 public String toString() { 12 return "Department [id=" + id + ", name=" + name + "]"; 13 } 14 15 }
Department.java
1 package Test; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 import java.io.ObjectInputStream; 8 import java.io.ObjectOutputStream; 9 10 import Entity.Department; 11 import Entity.Employee; 12 13 public class test1 { 14 15 /** 16 * 序列化对象 17 */ 18 @org.junit.Test 19 public void SerializeDemo() { 20 Employee e = new Employee(); 21 e.name = "Reyan Ali"; 22 e.address = "Phokka Kuan, Ambehta Peer"; 23 e.SSN = 11122333; 24 e.number = 101; 25 Department d = new Department(); 26 d.id = 1; 27 d.name = "Java研发"; 28 e.department = d; 29 try { 30 System.out.println(e); 31 FileOutputStream fileOut = new FileOutputStream(new File("/Users/zhengbinMac/employee.txt")); 32 ObjectOutputStream out = new ObjectOutputStream(fileOut); 33 System.out.println(e); 34 out.writeObject(e); 35 out.close(); 36 fileOut.close(); 37 System.out.printf("Serialized data is saved in /Users/zhengbinMac/employee.txt"); 38 } catch (IOException i) { 39 i.printStackTrace(); 40 } 41 } 42 43 /** 44 * 反序列化对象 45 */ 46 @org.junit.Test 47 public void DeserializeDemo() { 48 Employee e = null; 49 try { 50 FileInputStream fileIn = new FileInputStream("/Users/zhengbinMac/employee.txt"); 51 ObjectInputStream in = new ObjectInputStream(fileIn); 52 e = (Employee) in.readObject(); 53 in.close(); 54 fileIn.close(); 55 } catch (IOException i) { 56 i.printStackTrace(); 57 return; 58 } catch (ClassNotFoundException c) { 59 System.out.println("Employee class not found"); 60 c.printStackTrace(); 61 return; 62 } 63 System.out.println("Deserialized Employee..."); 64 System.out.println("Name: " + e.name); 65 System.out.println("Address: " + e.address); 66 System.out.println("SSN: " + e.SSN); 67 System.out.println("Number: " + e.number); 68 System.out.println("Department: " + e.department); 69 } 70 }
时间: 2024-10-25 17:24:57