序列化的問題
老師在上面說 如果實(shí)現(xiàn)了序列化接口那么其父類的則看不見父類的構(gòu)造方法被調(diào)用。
如果是這樣的話,最后的輸出結(jié)果難道不應(yīng)該是
bar1...
bar2...
嗎?為什么我的結(jié)果確實(shí)連父類的構(gòu)造方法也調(diào)用了?
package?com.Java; import?java.io.FileInputStream; import?java.io.FileOutputStream; import?java.io.IOException; import?java.io.ObjectInputStream; import?java.io.ObjectOutputStream; import?java.io.Serializable; public?class?Objectserial2?{ public?static?void?main(String[]?args)?throws?IOException,?Exception?{ // ObjectOutputStream?oos=new?ObjectOutputStream( // new?FileOutputStream("exer/obj.dat")); // Foo2?foo2=new?Foo2(); // oos.writeObject(foo2); // oos.flush(); // oos.close(); // // //反序列化是否遞歸調(diào)用父類的構(gòu)造函數(shù) // ObjectInputStream?ois=new?ObjectInputStream( // new?FileInputStream("exer/obj.dat")); // Foo2?foo21=(Foo2)ois.readObject(); // System.out.println(foo21); // ois.close(); ObjectOutputStream?oos=new?ObjectOutputStream( new?FileOutputStream("exer/obj.dat")); Bar2?bar2=new?Bar2(); oos.writeObject(bar2); oos.flush(); oos.close(); //反序列化是否遞歸調(diào)用父類的構(gòu)造函數(shù) ObjectInputStream?ois=new?ObjectInputStream( new?FileInputStream("exer/obj.dat")); Bar2?bar21=(Bar2)ois.readObject(); System.out.println(bar21); ois.close(); /* ?*?對(duì)子類對(duì)象進(jìn)行反序列化操作時(shí), ?*?如果父類沒有實(shí)現(xiàn)序列化接口 ?*?那么其父類的構(gòu)造函數(shù)會(huì)被調(diào)用 ?*/ } } //一個(gè)類實(shí)現(xiàn)了序列化接口,那么其子類都可以實(shí)現(xiàn)序列化 class?Foo?implements?Serializable{ public?Foo(){ System.out.println("fooo"); } } class?Foo1?extends?Foo{ public?Foo1(){ System.out.println("fooo11"); } } class?Foo2?extends?Foo1{ public?Foo2(){ System.out.println("foo222"); } } class?Bar?{ public?Bar(){ System.out.println("bar"); } } class?Bar1?extends?Bar?implements?Serializable{ public?Bar1(){ System.out.println("bar1..."); } } class?Bar2?extends?Bar1?{ public?Bar2(){ System.out.println("bar2..."); } }
2016-05-11
因?yàn)?你是 Bar2 bar2 = new Bar2(); ? bar2 = (Bar2)ois.readObject();
但是老師寫的是 ? Bar2 bar2 = (Bar2)ois.readObject(); ?這里要注意的是 老師并沒有去new一個(gè)Bar2對(duì)象
而你卻是先new出來的 肯定會(huì)調(diào)用父類的構(gòu)造函數(shù)
2016-05-07
子類在進(jìn)行反序列化操作時(shí),如果父類實(shí)現(xiàn)了序列化的接口,則不會(huì)遞歸調(diào)用其父類的構(gòu)造函數(shù),你的代碼中父類Bar未實(shí)現(xiàn)接口Serializable,所以在實(shí)現(xiàn)反序列的時(shí)候,當(dāng)然會(huì)調(diào)用其構(gòu)造函數(shù),這個(gè)程序的輸出結(jié)果應(yīng)該是只輸出了Bar的構(gòu)造函數(shù)的內(nèi)容吧?