前幾天閒來無事,想試試看Java的Serialization的功能,結果令我相當吃驚
的是,Java的Serialization是完全自動化的,你只需要把要Serialize的物件
加上implement Serializable就可以了,其他的完全由系統處理,以下面的
code為例子的話:
class MyClass implements Serializable
{
public String Name;
public MyClass AnotherObject;
MyClass()
{
}
}
(以下有Applet的Code,就省略了,重要的如下:)
void TestSerialize_Action(java.awt.event.ActionEvent event)
{
MyClass a = new MyClass();
MyClass b = new MyClass();
a.Name = new String("a");
b.Name = new String("b");
a.AnotherObject = b;
b.AnotherObject = a;
try
{
(new ObjectOutputStream(new FileOutputStream("Test.dat"))).writeObject(a);
}
catch(IOException k)
{
}
}
void TestDeserialize_Action(java.awt.event.ActionEvent event)
{
try
{
MyClass a = (MyClass)(new ObjectInputStream(new FileInputStream("Test.dat"))).readObject();
MyClass b = a.AnotherObject;
if (b.AnotherObject == a)
{
label1.setText("Correct!");
}
else
{
label1.setText("Error!");
}
}
catch(StreamCorruptedException k)
{
}
catch(ClassNotFoundException k)
{
}
catch(IOException k)
{
}
}
從上面的Code可以看得出來,物件A, B各內有一個指標指向對方,存檔之後再load出來的時候
關係跟存檔時是一樣的,如果在mfc裡面的話,不僅serialize要物件自行撰寫之外,碰到
這種有互相指的狀況更要特殊處理,不然的話很可能導致無窮回圈。Java的Serialization
則提供完整的graph traversal的演算法,這也應該要歸功於Java物件的封閉性,就是說
在Java裡面,由於物件都用較為高階的方式撰寫而成,而且不具有指標,所以對Java來說,
幾乎所有寫在code裡的咚咚對Compiler都是有意義的,不像C有什麼『void *』,compiler
根本不知道要做何種處理。
--
Power is unreal. Money is useless. Doctrine is a mistake in human society.
The human society, however, is a mistake itself. Change brings unstability.
Evolution leads to war. Life has no meaning if you want some. Goal for living
must be obtained by yourself. Nothing counts if you don't seek for it.
--
※ 發信站: 批踢踢實業坊(ptt.m8.ntu.edu.tw)
◆ From: ms22.hinet.net