介紹
Java序列化及反序列化是Java編程中經常用到的技術,它們允許對象以字節流的形式在網絡上傳輸或持久化到磁盤。正是由於Java序列化能夠將對象轉換成磁盤上或網絡上傳輸的字節流,使我們可以輕鬆地進行深度克隆、對象傳輸和數據交換等操作。
Java對象序列化機制是將對象的狀態信息轉換為可以存儲在磁盤文件或在網絡中傳輸的字節序列的過程。
序列化
Java對象序列化是Java API中提供的一種機制,依據該機制可以將任何實現了Serializable接口的Java對象轉換為字節流表示,然後可以將字節流表示的對象保存到磁盤中,或通過網絡傳輸到遠程系統。
實現
實現Java對象序列化僅需以下簡單步驟:
- 創建實現序列化接口Serializable的類。
- 實例化該類的對象。
- 創建ObjectOutputStream對象。該對象用於將將對象寫入流中。
- 調用ObjectOutputStream.writeObject()方法,將對象寫入流中。
- 流刷新並關閉。
//創建一個User對象
public class User implements Serializable {
private String username;
private String password;
private int age;
//獲取username、password、age等屬性的getters和setters方法省略
//toString方法
public String toString() {
return "username=" + username + ";password=" + password + ";age=" + age;
}
}
//serializing代碼
public class SerializingObject {
public static void main(String[] args) {
User user = new User("Tom", "123456", 18);
ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(new FileOutputStream("user.txt"));
oos.writeObject(user);
System.out.println("User對象序列化成功!");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
反序列化
反序列化是將字節數組還原成Java對象的過程。Java提供了一個ObjectInputStream類用於從流中反序列化對象。
實現
實現Java對象反序列化也很簡單,僅需以下幾個步驟:
- 創建ObjectInputStream對象,該對象用於從流中讀取對象。
- 調用ObjectInputStream.readObject()方法,將對象還原成Java對象。
public class DeSerializingObject {
public static void main(String[] args) {
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(new FileInputStream("user.txt"));
User user = (User) ois.readObject();
System.out.println("User對象反序列化成功!對象信息如下:");
System.out.println(user.toString());
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
要點
不適用於所有對象
Java序列化機制無法序列化static和transient修飾的成員變量,因為static修飾的成員變量不屬於對象的狀態,而transient修飾的成員變量代表不希望被序列化持久化。若序列化對象中帶有以上修飾符修飾的成員變量,需要注意這些變量的序列化和反序列化使用。
版本控制
對象的版本控制對序列化和反序列化具有重要影響。當一個對象被序列化後被修改,反序列化可能會失敗,因為反序列化時默認比較對象的serialVersionUID是否一致。若不一致,則反序列化失敗無法還原Java對象。因此,在對優先序列化的對象進行版本控制時,需要指定serialVersionUID來保證版本的一致。
public class User implements Serializable {
private static final long serialVersionUID = 143857367482L;
//其他代碼省略
}
安全問題
由於可以通過Java序列化機制將對象序列化成二進制碼,因此Java序列化機制可能會帶來安全問題。惡意攻擊者可以序列化惡意對象並發送給接收者從而導致安全問題。針對該問題,可以使用Java對象序列化框架,如Hessian、Kryo等,去解決Java序列化安全問題。
總結
Java序列化及反序列化可將Java對象序列化成字節流從而便於傳輸、存儲和分發。其序列化和反序列化過程非常簡單,但需要注意一些使用小細節和實際安全問題。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/249110.html
微信掃一掃
支付寶掃一掃