要將一個(gè)對(duì)象變成可序列化的對(duì)象,需要遵循以下步驟:
確保對(duì)象的類實(shí)現(xiàn)了 java.io.Serializable
接口。這個(gè)接口是一個(gè)標(biāo)記接口,沒有任何方法。
給對(duì)象添加一個(gè)私有的、靜態(tài)的 serialVersionUID
字段。這個(gè)字段用于標(biāo)識(shí)對(duì)象的序列化版本。如果不提供這個(gè)字段,Java 會(huì)根據(jù)對(duì)象的結(jié)構(gòu)自動(dòng)生成一個(gè)序列化版本號(hào),但這樣的自動(dòng)生成可能會(huì)導(dǎo)致不一致的問題。因此,建議手動(dòng)指定一個(gè)固定的版本號(hào),例如:private static final long serialVersionUID = 1L;
。
對(duì)于需要被序列化的字段,添加 transient
關(guān)鍵字,表示這個(gè)字段不會(huì)被序列化。這樣可以避免一些敏感或不需要被保存的數(shù)據(jù)被序列化。
在類中添加一個(gè)無參的構(gòu)造方法,這是因?yàn)樵诜葱蛄谢倪^程中,Java 使用無參構(gòu)造方法創(chuàng)建對(duì)象。
以下是一個(gè)示例:
import java.io.Serializable;
public class MyClass implements Serializable {
private static final long serialVersionUID = 1L;
private transient String sensitiveData;
private int nonSensitiveData;
public MyClass(String sensitiveData, int nonSensitiveData) {
this.sensitiveData = sensitiveData;
this.nonSensitiveData = nonSensitiveData;
}
// Getters and setters
@Override
public String toString() {
return "MyClass{" +
"sensitiveData='" + sensitiveData + '\'' +
", nonSensitiveData=" + nonSensitiveData +
'}';
}
}
在這個(gè)示例中,MyClass
類實(shí)現(xiàn)了 Serializable
接口,并定義了一個(gè)版本號(hào)和兩個(gè)字段。sensitiveData
字段被標(biāo)記為 transient
,表示它不會(huì)被序列化。
要將一個(gè)對(duì)象序列化,可以使用 ObjectOutputStream
類:
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
public class SerializationExample {
public static void main(String[] args) {
MyClass obj = new MyClass("Sensitive Data", 123);
try (FileOutputStream fileOut = new FileOutputStream("object.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut)) {
out.writeObject(obj);
System.out.println("Serialized object is saved in object.ser");
} catch (Exception e) {
e.printStackTrace();
}
}
}
在這個(gè)示例中,我們創(chuàng)建了一個(gè) MyClass
對(duì)象,并將其序列化到一個(gè)文件中。為此,我們使用了 ObjectOutputStream
類和 writeObject()
方法。
要將一個(gè)對(duì)象反序列化,可以使用 ObjectInputStream
類:
import java.io.FileInputStream;
import java.io.ObjectInputStream;
public class DeserializationExample {
public static void main(String[] args) {
MyClass obj = null;
try (FileInputStream fileIn = new FileInputStream("object.ser");
ObjectInputStream in = new ObjectInputStream(fileIn)) {
obj = (MyClass) in.readObject();
System.out.println("Deserialized object: " + obj);
} catch (Exception e) {
e.printStackTrace();
}
}
}
在這個(gè)示例中,我們從文件中讀取一個(gè)序列化的對(duì)象,并使用 ObjectInputStream
類和 readObject()
方法進(jìn)行反序列化。
這樣,你就可以將一個(gè)對(duì)象序列化和反序列化了。