java序列化存儲
① java中什麼是序列化,怎麼通俗理解序列化和反序列化
在 Java 中,序列化是指將一個 Java 對象轉換為可以存儲或傳輸的格式的過程。這個過程通常用於持久化對象,即將對象的狀態保存到文件或資料庫中,或在網路上傳輸對象。序列化的一個關鍵目的是使對象能夠在不同平台、不同版本的 Java 虛擬機之間進行交換或存儲,而不會丟失對象的任何狀態信息。
反序列化是序列化的逆過程,即將序列化的數據恢復為原始對象。這個過程需要確保序列化的數據格式與反序列化時使用的類結構相匹配,以便正確地重建對象。
在實際開發中,序列化和反序列化通常用於以下場景:
- 持久化對象:將對象的狀態保存到文件或資料庫,以便在後續需要時恢復對象。
- 網路傳輸:在多台計算機之間傳輸對象,以實現分布式系統或遠程過程調用(RPC)。
- 內存緩存:將對象序列化到內存中,以便快速訪問對象狀態。
序列化協議對應於 TCP/IP 四層模型的應用層。在這個模型中,應用層處理用戶數據的傳輸,而表示層負責數據的格式轉換,這正是序列化和反序列化所做的事情。
常見的序列化協議包括:
- JDK自帶的序列化:實現 Serializable 介面。雖然簡單易用,但效率較低且存在安全漏洞。
- Hessian:一個輕量級、自定義描述的二進制 RPC 協議。
- Kryo:高性能的序列化/反序列化工具,支持 Java 語言,並在 Twitter、Groupon 等公司中有廣泛應用。
- Protobuf(Protocol Buffers):由 Google 提供,性能優秀,支持多種語言,跨平台。
- Protostuff:基於 Protobuf 的實現,提供更簡易的用法。
在選擇序列化協議時,應考慮以下因素:
- 性能:序列化和反序列化的速度。
- 體積:序列化後數據的大小。
- 易用性:協議的使用復雜度。
- 跨語言支持:如果需要在不同語言之間傳輸數據。
綜上所述,Kryo 是一種性能優秀且成熟的序列化協議,適用於 Java 環境。Protobuf 和 Protostuff 為跨語言應用提供了便利。Hessian 為輕量級的二進制 RPC 協議,適合用於網路通信。在選擇序列化協議時,應根據具體需求和場景選擇最合適的一種。
② java 中的序列化是什麼意思
簡單說就是為了保存在內存中的各種對象的狀態,並且可以把保存的對象狀態再讀出來。雖然你可以用你自己的各種各樣的方法來保存Object States,但是Java給你提供一種應該比你自己好的保存對象狀態的機制,那就是序列化。
(1)什麼情況下需要序列化態察
a)當你想把的內存中的對象保存到一個文件中或者資料庫中時候;
b)當你想用套接字在網路上傳送對象的時候;
c)當你想通過RMI傳輸對象的時候;
(3)實現序列化(保存到一個文件)的步驟
a)Make a FileOutputStream
java 代碼
FileOutputStream fs = new FileOutputStream("foo.ser");
b)Make a ObjectOutputStream
java 代碼
ObjectOutputStream os = new ObjectOutputStream(fs);
c)write the object
java 代碼
os.writeObject(myObject1);
os.writeObject(myObject2);
os.writeObject(myObject3);
d) close the ObjectOutputStream
java 代碼
os.close();
(4)舉例說明
java 代碼
import java.io.*;
public class Box implements Serializable
{
private int width;
private int height;
public void setWidth(int width){
this.width = width;
}
public void setHeight(int height){
this.height = height;
}
public static void main(String[] args){
Box myBox = new Box();
myBox.setWidth(50);
myBox.setHeight(30);
try{
FileOutputStream fs = new FileOutputStream("foo.ser");
ObjectOutputStream os = new ObjectOutputStream(fs);
os.writeObject(myBox);
os.close();
}catch(Exception ex){
ex.printStackTrace();
}
}
}
總結:安全方面的原因,比如一個對象擁有private,public等field,對於一個要傳輸的對象,則沖比如寫到文件,或者進行rmi傳輸 等等,在序列化進行傳輸的過程中,這個對象的private等域是不受保護的。資源分配方面的原因,比如socket,thread類,如果可以序列化,進行傳輸或者保存,也無法帆盯茄對他們進行重新的資源分 配,而且,也是沒有必要這樣實現。
③ java中如何實現序列化,有什麼意義
首先我們要把准備要序列化類,實現 Serializabel介面
例如:我們要Person類里的name和age都序列化
import java.io.Serializable;
public class Person implements Serializable { //本類可以序列化
private String name ;
private int age ;
public Person(String name,int age){
this.name = name ;
this.age = age ;
}
public String toString(){
return "姓名:" + this.name + ",年齡" + this.age ;
}
}
然後:我們將name和age序列化(也就是把這2個對象轉為二進制,統族理解為「打碎」)
package org.lxh.SerDemo;
import java.io.File;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream ;
public class ObjectOutputStreamDemo { //序列化
public static void main(String[] args) throws Exception {
//序列化後生成指定文件路徑
File file = new File("D:" + File.separator + "person.ser") ; ObjectOutputStream oos = null ;
//裝飾流(流)
oos = new ObjectOutputStream(new FileOutputStream(file)) ;
//實例化類
Person per = new Person("張三",30) ; oos.writeObject(per) ;//把類對象序列化
oos.close() ;
}
}