日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > 綜合技術 > java中序列化與反序列化的冷知識

java中序列化與反序列化的冷知識

來源:程序員人生   發布時間:2015-01-06 08:55:34 閱讀次數:2556次

    轉載請注明出處:http://blog.csdn.net/zhaokaiqiang1992

    關于甚么是序列化,和為何要序列化的知識就不再論述了,本文主要探討1些特殊點的情況。

    

    1.java中如何實現序列化和反序列化

    下面的代碼是進行序列化的簡單實例

public static void main(String[] args) { System.out.println("-----------------序列化----------------------↓"); Student student1 = new Student(10, "zhao"); Student student2 = new Student(15, "kai"); Student student3 = new Student(20, "qiang"); ObjectOutputStream objectWriter = null; try { objectWriter = new ObjectOutputStream(new FileOutputStream( new File("./Serializable"))); objectWriter.writeObject(student1); objectWriter.writeObject(student2); objectWriter.writeObject(student3); } catch (Exception e) { e.printStackTrace(); } finally { try { objectWriter.close(); } catch (IOException e) { e.printStackTrace(); } } System.out.println("-----------------反序列化----------------------↓"); ObjectInputStream objectInputStream = null; try { objectInputStream = new ObjectInputStream(new FileInputStream( new File("./Serializable"))); Student s1 = (Student) objectInputStream.readObject(); Student s2 = (Student) objectInputStream.readObject(); Student s3 = (Student) objectInputStream.readObject(); System.out.println(s1.toString()); System.out.println(s2.toString()); System.out.println(s3.toString()); } catch (Exception e) { e.printStackTrace(); } finally { try { objectInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } }

    2.在反序列化的時候,需要調用本類的構造函數嗎?

    我的測試序列化的類以下,在無參和有參的構造函數中,打印了語句,然后,我們使用上面的序列化和反序列化代碼進行測試。

public class Student implements Serializable { private int age; private String name; public Student() { System.out.println("Student()"); } public Student(int age, String name) { this.age = age; this.name = name; System.out.println("Student(int age, String name)"); } @Override public String toString() { return "Student [age=" + age + ", name=" + name + "]"; } }

    下面是測試結果

-----------------序列化----------------------↓ Student(int age, String name) Student(int age, String name) Student(int age, String name) -----------------反序列化----------------------↓ Student [age=10, name=zhao] Student [age=15, name=kai] Student [age=20, name=qiang]

    因此,我們可以認為,在反序列化的時候,是不需要調用本類的構造函數的。


    2.反序列化的時候,會調用父類的構造函數嗎?

    我們新創建1個Person類,然后用Student繼承自Person,Student的代碼以下

public class Student extends Person implements Serializable { private int age; private String name; public Student() { System.out.println("Student()"); } public Student(int age, String name) { this.age = age; this.name = name; System.out.println("Student(int age, String name)"); } @Override public String toString() { return "Student [age=" + age + ", name=" + name + "]"; } }

    Person類的代碼以下

public class Person { private boolean sex; public Person() { System.out.println("Person()"); } public Person(boolean sex) { this.sex = sex; System.out.println("Person(boolean sex)"); } @Override public String toString() { return "Person [sex=" + sex + "]"; } }

    一樣,我把Person的構造函數都進行了輸出,然后利用上面的代碼進行測試,下面是測試結果

-----------------序列化----------------------↓ Person() Student(int age, String name) Person() Student(int age, String name) Person() Student(int age, String name) -----------------反序列化----------------------↓ Person() Person() Person() Student [age=10, name=zhao] Student [age=15, name=kai] Student [age=20, name=qiang]

    我們可以看到,雖然Student的構造函數沒有調用,但是Person的無參構造函數卻調用了,這也就是說,在反序列化的時候,本類的構造函數不會調用,但是會調用其父類的無參構造函數。在沒有繼承的情況下,會調用所有類的父類,即Object的構造函數。


    3.當需要序列化的類的父類沒有實現序列化的時候,能否將父類中protect的屬性進行序列化和反序列化呢?

    為了進行測試,我們需要將Person類的代碼進行修改,下面修改以后的代碼

public class Person { protected boolean sex; public Person() { System.out.println("Person()"); } public Person(boolean sex) { this.sex = sex; System.out.println("Person(boolean sex)"); } @Override public String toString() { return "Person [sex=" + sex + "]"; } }

    同時,我們還需要修改Student的toString(),下面是修改以后Student代碼

public class Student extends Person implements Serializable { private int age; private String name; public Student() { System.out.println("Student()"); } public Student(int age, String name) { this.age = age; this.name = name; System.out.println("Student(int age, String name)"); } public Student(int age, String name, boolean sex) { super(sex); this.age = age; this.name = name; } @Override public String toString() { return "Student [age=" + age + ", name=" + name + ", sex=" + sex + "]"; } }

    我們進行序列化和反序列化,下面是測試結果

-----------------序列化----------------------↓ Person(boolean sex) Person(boolean sex) Person() Student(int age, String name) -----------------反序列化----------------------↓ Person() Person() Person() Student [age=10, name=zhao, sex=false] Student [age=15, name=kai, sex=false] Student [age=20, name=qiang, sex=false]

    從結果中可以看到,雖然父類沒有進行序列化,但是sex屬性也參與了序列化和反序列化操作,因此不影響。


    從上面幾個測試的結果中,我們可以得出結論:進行序列化和反序列化必須調用其父類的無參的構造函數。







生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 国产成人精品一区二区三区在线 | 免费一区二区 | 成人在线视频网址 | 亚洲第一网站 | 精品欧美一区二区三区免费观看 | 污网站免费观看 | 久久久久国产亚洲日本 | 欧美精品a∨在线观看不卡 黄色av免费 | av2区| 国内精品久久久久久久 | 99国产欧美 | 亚洲国产精品99久久久久久久久 | 亚洲视频1区 | 最新日韩精品 | 免费av看 | 免费一二三区 | uu天堂| 综合视频一区 | 三级av在线 | 日韩精品视频中文字幕 | 国产成人小视频 | jizz18欧美| 成人在线观看免费 | 香蕉成人啪国产精品视频综合网 | 一级片黄色 | 中文字幕亚洲视频 | 中文字幕3区 | 亚洲国产一区二区三区, | 日本久久久一区二区三区 | 中文精品一区 | 国产高清无密码一区二区三区 | 毛片免费观看视频 | 亚洲午夜久久久 | 成人久久久久 | 日韩av不卡在线播放 | 91精品国产乱码久久久久久久久 | 久久成人国产精品 | 日韩久久久精品 | 999精品视频在这里 亚洲一级免费观看 | 久久aaa | 一本色道久久综合亚洲二区三区 |