外部化相對於序列化的主要優點是外部化僅保留部分對象,而不是序列化時的整個對象。但我認爲我們可以通過自定義序列化來模擬外部化,如果我們不調用defaultWriteObject()方法ObjectOutputStreamwriteObject()可序列化類的方法。因此,如果沒有調用defaultWriteObject()方法並且只持久化可用於實現外部化優勢的可序列化類的實例變量writeObject()方法。通過自定義序列化模擬Java對象外化
下面是一個例子證明上述事情:
package com.test;
import java.io.*;
public class Test {
public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
Dog dog = new Dog();
System.out.println("before serialization: i = " + dog.i + ", j = " + dog.j);
FileOutputStream fos = new FileOutputStream("abc.ser");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(dog);
FileInputStream fis = new FileInputStream("abc.ser");
ObjectInputStream ois = new ObjectInputStream(fis);
Dog dog2 = (Dog) ois.readObject();
System.out.println("after deserialization: i = " + dog2.i + ", j = " + dog2.j);
}
public static class Dog implements Serializable {
int i = 10;
int j = 20;
private void writeObject(ObjectOutputStream oos) throws IOException{
//oos.defaultWriteObject();
System.out.println("In WriteObject");
oos.writeInt(i);
}
private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
//ois.defaultReadObject();
System.out.println("In ReadObject");
i = ois.readInt();
}
}
}
此代碼的輸出是:
before serialization: i = 10, j = 20
In WriteObject
In ReadObject
after deserialization: i = 10, j = 0
正如你所看到的,oos.defaultWriteObject()
和ois.defaultReadObject();
被註釋掉,我們堅持和恢復只有實例變量i
。
那麼,我的假設是否正確,我們可以通過自定義序列化來模擬外化概念?
*「外部化優於序列化的主要好處是外部化只保留部分對象,而不是序列化情況下的整個對象」* ...你在問什麼?序列化表單應該有足夠的信息來保存和恢復對象的狀態。 「對象的一部分」的概念在序列化的背景下沒有意義。如果您指的是「自定義序列化表單」,則內置序列化工具可以創建完全自定義的序列化表單。 – scottb
@scottb我已經用示例更新了我的問題,請查看。 –