作者pao0111 (Pao)
看板java
标题[心得] 序列化的小细节
时间Wed Oct 25 23:16:20 2006
在物件导向当中,如何将物件里的资料简易方便的保存或传输,
而不用繁杂的订定格式、解析资料等,不是个简单的问题。
所幸在Java的世界里有序列化这方便好用的功能。
轻易的将物件序列化後就可透过各种资料流保存或传输。
相信大家也对序列化都很熟悉了。
这边想提的是最近我写程式用到序列化时,忽略掉的细节。
「多个有互相参照的序列化物件储存问题」
假设今天有两个序列化的类别如下:
public class A implements Serializable
{
public B b;
}
public class B implements Serializable
{
public A a;
}
两个物件互相参照:
A a = new A();
B b = new B();
a.b = b;
b.a = a;
想当然尔:
System.out.println(a.b == b);
System.out.println(a.b.a == a);
System.out.println(b.a == a);
System.out.println(b.a.b == b);
印出来的是:
true
true
true
true
分别写入两个档案:
FileOutputStream fos = new FileOutputStream("a.object");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(a);
oos.close();
fos = new FileOutputStream("b.object");
oos = new ObjectOutputStream(fos);
oos.writeObject(b);
oos.close();
嗯,没错误发生。
可见互相参考甚至是循环参考对物件的序列化是没问题的。
在别的程式里,读出那两个物件来:
FileInputStream fis = new FileInputStream("a.object");
ObjectInputStream ois = new ObjectInputStream(fis);
A a = (A)ois.readObject();
fis = new FileInputStream("b.object");
ois = new ObjectInputStream(fis);
B b = (B)ois.readObject();
此时:
System.out.println(a.b == b);
System.out.println(a.b.a == a);
System.out.println(b.a == a);
System.out.println(b.a.b == b);
印出来的是:
false
true
false
true
哎呀!参照居然变了!
那改成都在同一个资料流呢?
物件输出资料流用同一个再写一次:
A a = new A();
B b = new B();
a.b = b;
b.a = a;
FileOutputStream fos = new FileOutputStream("objects");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(a);
oos.writeObject(b);
oos.close();
在别的程式里,读出那两个物件来:
FileInputStream fis = new FileInputStream("objects");
ObjectInputStream ois = new ObjectInputStream(fis);
A a = (A)ois.readObject();
B b = (B)ois.readObject();
ois.close();
此时:
System.out.println(a.b == b);
System.out.println(a.b.a == a);
System.out.println(b.a == a);
System.out.println(b.a.b == b);
印出来的是:
true
true
true
true
终於是原先要的结果了...XD
我想,在我们写程式写的忙得时候,
往往会忽略一些小细节。
所以发这篇提醒自己也提醒大家,
希望会有所帮助... ^^
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.113.65.151