關(guān)于父類沒有無參構(gòu)造函數(shù)的反序列化問題
有沒有發(fā)現(xiàn)一個(gè)問題,如果我們定義三個(gè)類Bar ?Bar1 ?Bar2,其中Bar2實(shí)現(xiàn)了serializable接口,Bar1沒有無參構(gòu)造函數(shù),那么在對(duì)Bar2進(jìn)行反序列化的時(shí)候會(huì)拋出異常,請(qǐng)問這種情況應(yīng)該怎么解決呀
有沒有發(fā)現(xiàn)一個(gè)問題,如果我們定義三個(gè)類Bar ?Bar1 ?Bar2,其中Bar2實(shí)現(xiàn)了serializable接口,Bar1沒有無參構(gòu)造函數(shù),那么在對(duì)Bar2進(jìn)行反序列化的時(shí)候會(huì)拋出異常,請(qǐng)問這種情況應(yīng)該怎么解決呀
2018-02-24
舉報(bào)
2018-03-02
我這里用你的沒有一點(diǎn)問題誒? 是不是main函數(shù)有問題
你把序列、反序列封裝成函數(shù),那我的main函數(shù)是這樣的:
ObjectOutputStream oos = new ObjectOutputStream(
? ? ? ? ? ? ? ? new FileOutputStream("demo/obj2.dat")
? ? ? ? );
? ? ? ? Bar2 bar2 = new Bar2();
? ? ? ? oos.writeObject(bar2);
? ? ? ? oos.flush();
? ? ? ? oos.close();
//? ? ? ? ObjectInputStream ois = new ObjectInputStream(
//? ? ? ? ? ? ? ? new FileInputStream("demo/obj2.dat")
//? ? ? ? );
//? ? ? ? Bar2 bar2 = (Bar2)ois.readObject();
//? ? ? ? System.out.println(bar2);
//? ? ? ? ois.close();
2018-03-02
class?Bar?{ ?Bar() ?{ ??a?=?1; ??System.out.println("Bar..."?+?a); ?} ?protected?int?a; } class?Bar1?extends?Bar?implements?Serializable { ?Bar1(double?b) ?{ ??this.b?=?b; ??System.out.println("Bar1..."?+?b); ?} ?Bar1() ?{ ??this.b?=?1.5; ??System.out.println("Bar1..."?+?b); ?} ?protected?double?b; } class?Bar2?extends?Bar1? { ?/** ??*? ??*/ ?private?static?final?long?serialVersionUID?=?270589360374420361L; ?Bar2() ?{ ??super(); ??c?=?3; ??System.out.println("Bar2..."?+?c); ?} ?protected?int?c; ? } 代碼是這樣的,主函數(shù)里面是: String?file?=?"C:\\JAVA\\1.txt"; ??Bar2?bar2?=?new?Bar2(); ?? //??objectSerialize(bar2,?file); ? ??objectDeserialize(bar2,?file); ?? ??System.out.println(bar2); ?? 拋出了一坨異常: Exception?in?thread?"main"?java.io.InvalidClassException:?com.clcl.io.Bar1;?local?class?incompatible:?stream?classdesc?serialVersionUID?=?7973625721886668699,?local?class?serialVersionUID?=?-1556330232670652696 ?at?java.base/java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:689) ?at?java.base/java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1894) ?at?java.base/java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1763) ?at?java.base/java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1894) ?at?java.base/java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1763) ?at?java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2051) ?at?java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1585) ?at?java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:422) ?at?com.clcl.io.FileTest.objectDeserialize(FileTest.java:83) ?at?com.clcl.io.FileTest.main(FileTest.java:44)2018-02-27
我試了一下沒有問題呀
需要注意的是,如果你修改了Bar1就需要重新序列化一次
不能直接進(jìn)行反序列的吧?