Java 序列化

1. 序列化介紹

Java 提供了一種對象序列化的機制,該機制中,一個對象能夠被表示爲一個字節序列,該字節序列包括該對象的數據、有關對象的類型的信息和存儲在對象中數據的類型。java

將序列化對象寫入文件以後,能夠從文件中讀取出來,而且對它進行反序列化,也就是說,對象的類型信息、對象的數據,還有對象中的數據類型能夠用來在內存中新建對象。ide

整個過程都是 Java 虛擬機(JVM)獨立的,也就是說,在一個平臺上序列化的對象能夠在另外一個徹底不一樣的平臺上反序列化該對象。性能

類 ObjectInputStream 和 ObjectOutputStream 是高層次的數據流,它們包含序列化和反序列化對象的方法。this

ObjectOutputStream 類包含不少寫方法來寫各類數據類型,可是一個特別的方法例外:spa

public final void writeObject(Object x) throws IOExceptio

上面的方法序列化一個對象,並將它發送到輸出流。類似的 ObjectInputStream 類包含以下反序列化一個對象的方法:code

public final Object readObject() throws IOException, ClassNotFoundException

 

該方法從流中取出下一個對象,並將對象反序列化。它的返回值爲Object,所以,你須要將它轉換成合適的數據類型。對象

2. Demo

2.1 序列化對象

假設咱們定義了以下的Person類,該類實現了Serializable 接口。blog

Person.java接口

 1 package com.loveincode.serialize;
 2 
 3 public class Person implements java.io.Serializable {
 4 
 5     private static final long serialVersionUID = 1L;
 6     
 7     public String name;
 8     public String sex;
 9     public String phone;
10     
11     public String getName() {
12         return name;
13     }
14     public void setName(String name) {
15         this.name = name;
16     }
17     public String getSex() {
18         return sex;
19     }
20     public void setSex(String sex) {
21         this.sex = sex;
22     }
23     public String getPhone() {
24         return phone;
25     }
26     public void setPhone(String phone) {
27         this.phone = phone;
28     }
29     @Override
30     public String toString() {
31         return "Person [name=" + name + ", sex=" + sex + ", phone=" + phone + "]";
32     }
33

請注意,一個類的對象要想序列化成功,必須知足兩個條件:內存

該類必須實現 java.io.Serializable 對象。

該類的全部屬性必須是可序列化的。若是有一個屬性不是可序列化的,則該屬性必須註明是短暫的。

若是你想知道一個 Java 標準類是不是可序列化的,請查看該類的文檔。檢驗一個類的實例是否能序列化十分簡單, 只須要查看該類有沒有實現 java.io.Serializable接口。

2.2 序列化

ObjectOutputStream 類用來序列化一個對象,以下的 SerializeDemo 例子實例化了一個 Person對象,並將該對象序列化到一個文件中。

該程序執行後,就建立了一個名爲 person.ser 文件。

注意: 當序列化一個對象到文件時, 按照 Java 的標準約定是給文件一個 .ser 擴展名。

SerializeDemo.java

 1 package com.loveincode.serialize;
 2 
 3 import java.io.FileOutputStream;
 4 import java.io.IOException;
 5 import java.io.ObjectOutputStream;
 6 
 7 public class SerializeDemo {
 8     public static void main(String[] args) {
 9         Person p = new Person();
10         p.setName("loveincode");
11         p.setSex("man");
12         p.setPhone("15888888888");
13         try {
14             FileOutputStream fileOut = new FileOutputStream("person.ser");
15             ObjectOutputStream out = new ObjectOutputStream(fileOut);
16             out.writeObject(p);
17             out.close();
18             fileOut.close();
19             System.out.printf("Serialized data is saved in person.ser");
20         } catch (IOException i) {
21             i.printStackTrace();
22         }
23     }
24 }

2.3 反序列化

下面的 DeserializeDemo 程序實例了反序列化,person.ser 存儲了 Employee 對象。

DeserializeDemo.java

 1 package com.loveincode.serialize;
 2 
 3 import java.io.FileInputStream;
 4 import java.io.IOException;
 5 import java.io.ObjectInputStream;
 6 
 7 public class DeserializeDemo {
 8     public static void main(String[] args) {
 9         Person p = null;
10         try {
11             FileInputStream fileIn = new FileInputStream("person.ser");
12             ObjectInputStream in = new ObjectInputStream(fileIn);
13             p = (Person) in.readObject();
14             in.close();
15             fileIn.close();
16         } catch (IOException i) {
17             i.printStackTrace();
18             return;
19         } catch (ClassNotFoundException c) {
20             System.out.println("Person class not found");
21             c.printStackTrace();
22             return;
23         }
24         System.out.println("Deserialized Person...");
25         System.out.println(p.toString());
26     }
27 }

2.4 運行截圖

運行SerializeDemo

運行DeserializeDemo

3 Google protobuf

  (性能很是高)

相關文章
相關標籤/搜索