序列化起初看樣子,我以為緊緊是記錄和還原物件的值而已,如a.x=10,b.y=20。
不過,其實很多情況確實沒有想過,例如下面的例子:
employee harry = new employee("harry hacker", 50000, 1989, 10, 1);
manager carl = new manager("carl cracker", 80000, 1987, 10, 1);
carl.setsecretary(harry);
manager tony = new manager("tony tester", 40000, 1990, 10, 1);
tony.setsecretary(harry);
employee staff = new employee[3];
staff[0] = carl;
staff[1] = harry;
staff[2] = tony;
objectoutputstream out = new objectoutputstream(new fileoutputstream("employee.dat"));
out.writeobject(staff);
out.close();
看得到,第乙個物件被存入了後兩個的物件中,以前從沒想過是否能讀出來過,那麼看看下面的**:
objectinputstream in = ***;
employee newstaff = (employee)in.readobject();
in.close();
newstaff[1].raisesalary(10);
for(employee e = newstaff)
我們根據列印,可以看到,物件真的被完美還原了,很酷吧。
為什麼會這樣呢?原因是,我們這種機制,每個物件都是用乙個[color=red]序列號(serial number)[/color]儲存的,這就是這種機制之所以稱為[color=red]物件序列化的原因[/color]。
簡單介紹一下演算法:
[list]
[*]每遇到乙個物件引用都關聯乙個序列號
[*]對於每個物件,當第一次遇見,儲存其物件資料到流中。
[*]如果某個物件之前儲存過,那麼只記錄「與之前儲存過的序列號為x的物件相同」
[/list]
在讀回物件時,整個過程相反:
[list]
[*]對於流中的物件,在第一次遇到其序列號時,構建它,並使用流中資料來初始化它,然後記錄這個序列號和新物件的關聯。
[*]當下次遇到序列號同時為x的物件時,獲取與這個序列號相關聯的物件引用。
[/list]
所以,綜上所述,物件就被完整的還原了~
新手指南 序列化篇之二
序列化初步 翻譯 原著 http www.codeproject.com cpp serialization primer2.asp 在第一部分,我們學到了如何通過carchive 類的serialize 函式來序列化乙個簡單物件。象下面的程式這樣 int cfoo serialize carchi...
新手指南 序列化篇之二
序列化初步 翻譯 原著 http www.codeproject.com cpp serialization primer2.asp 在第一部分,我們學到了如何通過carchive 類的serialize 函式來序列化乙個簡單物件。象下面的程式這樣 int cfoo serialize carchi...
新手指南 序列化篇之二
序列化初步 翻譯 原著 http www.codeproject.com cpp serialization primer2.asp 在第一部分,我們學到了如何通過carchive 類的serialize 函式來序列化乙個簡單物件。象下面的程式這樣 int cfoo serialize carchi...