什么是對象的序列化?
序列化:把對象轉化成字節序列的過程就是對象的序列化;反序列化:把字節序列轉化成對象的過程就是對象的反序列化。單看概念比較抽象,但是看代碼就會明白。
對象序列化的用途
1、Java程序在運行中,對象都是分配在內存中,而序列化的一個用途就是將內存的中對象轉化成磁盤中的對象。
2、對象不能直接在網絡中傳輸,有時候需要將對象轉成字節序列在網絡中傳輸,這就是對象序列化的第二個用途。
如何實現對象的序列化?
1、新建一個實體對象,實現Serializable接口,這個實體對象就可以進行序列化了
package test.entity; import java.io.Serializable; /** * 實體類,用於序列化 * * @author YaoQi * @date 2017年6月24日 */ public class Person implements Serializable { /** * 序列化ID */ private static final long serialVersionUID = -3245478690496182643L; 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; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } }
2、在另一個類中序列化這個實體類,並且將序列化之后的字節序列存在磁盤上。
package test.serializable; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.Date; import test.entity.Person; /** * java實現對象的序列化 * * @author YaoQi * @date 2017年6月24日 */ public class SerializableDemo { public static void main(String[] args) throws Exception { //序列化一個對象 ObjectOutputStream objOutputStream = new ObjectOutputStream(new FileOutputStream("D:\\obj.txt")); Person person = new Person(); person.setName("Tom"); person.setAge(24); //寫入字面值常量 objOutputStream.writeObject("將對象序列化"); //寫入匿名對象 objOutputStream.writeObject(new Date()); //寫入對象 objOutputStream.writeObject(person); //反序列化一個對象 ObjectInputStream objInputStream = new ObjectInputStream(new FileInputStream("D:\\obj.txt")); System.out.println("讀取的字面值常量:"+(String)objInputStream.readObject()); System.out.println("讀取的匿名對象"+(Date)objInputStream.readObject()); System.out.println("讀取person對象"+((Person)objInputStream.readObject()).toString()); } }
執行之后控制台結果如下:
讀取的字面值常量:將對象序列化
讀取的匿名對象Sat Jun 24 22:42:22 CST 2017
讀取person對象Person [name=Tom, age=24]