愚公系列2022年01月 Java教學課程 57-對象的序列化和反序列化

      網友投稿 870 2022-05-29

      一、對象的序列化和反序列化

      1.對象序列化流

      對象序列化介紹

      對象序列化:就是將對象保存到磁盤中,或者在網絡中傳輸對象

      這種機制就是使用一個字節序列表示一個對象,該字節序列包含:對象的類型、對象的數據和對象中存儲的屬性等信息

      字節序列寫到文件之后,相當于文件中持久保存了一個對象的信息

      反之,該字節序列還可以從文件中讀取回來,重構對象,對它進行反序列化

      對象序列化流: ObjectOutputStream

      將Java對象的原始數據類型和圖形寫入OutputStream。 可以使用ObjectInputStream讀取(重構)對象。 可以通過使用流的文件來實現對象的持久存儲。 如果流是網絡套接字流,則可以在另一個主機上或另一個進程中重構對象

      構造方法

      序列化對象的方法

      示例代碼

      學生類

      public class Student implements Serializable { private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } }

      測試類

      public class ObjectOutputStreamDemo { public static void main(String[] args) throws IOException { //ObjectOutputStream(OutputStream out):創建一個寫入指定的OutputStream的ObjectOutputStream ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("myOtherStream\oos.txt")); //創建對象 Student s = new Student("佟麗婭",30); //void writeObject(Object obj):將指定的對象寫入ObjectOutputStream oos.writeObject(s); //釋放資源 oos.close(); } }

      注意事項

      一個對象要想被序列化,該對象所屬的類必須必須實現Serializable 接口

      Serializable是一個標記接口,實現該接口,不需要重寫任何方法

      2.對象反序列化流

      對象反序列化流: ObjectInputStream

      ObjectInputStream反序列化先前使用ObjectOutputStream編寫的原始數據和對象

      構造方法

      反序列化對象的方法

      示例代碼

      public class ObjectInputStreamDemo { public static void main(String[] args) throws IOException, ClassNotFoundException { //ObjectInputStream(InputStream in):創建從指定的InputStream讀取的ObjectInputStream ObjectInputStream ois = new ObjectInputStream(new FileInputStream("myOtherStream\oos.txt")); //Object readObject():從ObjectInputStream讀取一個對象 Object obj = ois.readObject(); Student s = (Student) obj; System.out.println(s.getName() + "," + s.getAge()); ois.close(); } }

      3.serialVersionUID&transient

      serialVersionUID

      用對象序列化流序列化了一個對象后,假如我們修改了對象所屬的類文件,讀取數據會不會出問題呢?

      會出問題,會拋出InvalidClassException異常

      如果出問題了,如何解決呢?

      重新序列化

      給對象所屬的類加一個serialVersionUID

      private static final long serialVersionUID = 42L;

      transient

      如果一個對象中的某個成員變量的值不想被序列化,又該如何實現呢?

      給該成員變量加transient關鍵字修飾,該關鍵字標記的成員變量不參與序列化過程

      示例代碼

      學生類

      public class Student implements Serializable { private static final long serialVersionUID = 42L; private String name; // private int age; private transient int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } // @Override // public String toString() { // return "Student{" + // "name='" + name + '\'' + // ", age=" + age + // '}'; // } }

      測試類

      public class ObjectStreamDemo { public static void main(String[] args) throws IOException, ClassNotFoundException { // write(); read(); } //反序列化 private static void read() throws IOException, ClassNotFoundException { ObjectInputStream ois = new ObjectInputStream(new FileInputStream("myOtherStream\oos.txt")); Object obj = ois.readObject(); Student s = (Student) obj; System.out.println(s.getName() + "," + s.getAge()); ois.close(); } //序列化 private static void write() throws IOException { ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("myOtherStream\oos.txt")); Student s = new Student("佟麗婭", 30); oos.writeObject(s); oos.close(); } }

      4.對象操作流練習

      案例需求

      創建多個學生類對象寫到文件中,再次讀取到內存中

      實現步驟

      創建序列化流對象

      創建多個學生對象

      將學生對象添加到集合中

      將集合對象序列化到文件中

      創建反序列化流對象

      【愚公系列】2022年01月 Java教學課程 57-對象的序列化和反序列化

      將文件中的對象數據,讀取到內存中

      代碼實現

      學生類

      public class Student implements Serializable{ private static final long serialVersionUID = 2L; private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }

      測試類

      public class Demo03 { /** * read(): * 讀取到文件末尾返回值是 -1 * readLine(): * 讀取到文件的末尾返回值 null * readObject(): * 讀取到文件的末尾 直接拋出異常 * 如果要序列化的對象有多個,不建議直接將多個對象序列化到文件中,因為反序列化時容易出異常 * 建議: 將要序列化的多個對象存儲到集合中,然后將集合序列化到文件中 */ public static void main(String[] args) throws Exception { /*// 序列化 //1.創建序列化流對象 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("myCode\\oos.txt")); ArrayList arrayList = new ArrayList<>(); //2.創建多個學生對象 Student s = new Student("佟麗婭",30); Student s01 = new Student("佟麗婭",30); //3.將學生對象添加到集合中 arrayList.add(s); arrayList.add(s01); //4.將集合對象序列化到文件中 oos.writeObject(arrayList); oos.close();*/ // 反序列化 //5.創建反序列化流對象 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("myCode\\oos.txt")); //6.將文件中的對象數據,讀取到內存中 Object obj = ois.readObject(); ArrayList arrayList = (ArrayList)obj; ois.close(); for (Student s : arrayList) { System.out.println(s.getName() + "," + s.getAge()); } } }

      5G教育 Java

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:為什么需要學習并發編程?
      下一篇:Kudu的技術原理分析及與HBase的比較
      相關文章
      亚洲电影中文字幕| 亚洲第一se情网站| 亚洲日韩国产精品乱| 日韩亚洲产在线观看| 亚洲精品综合久久中文字幕 | 在线观看亚洲天天一三视| 久久精品国产亚洲av天美18| 亚洲日本VA中文字幕久久道具| 亚洲午夜久久久精品电影院| 亚洲视频中文字幕在线| 亚洲欧洲在线观看| 亚洲黄色网站视频| 亚洲国产天堂久久综合网站| 亚洲成av人片在线观看无码不卡| 国产成人精品日本亚洲| 亚洲AV无码日韩AV无码导航| 亚洲成色www久久网站夜月| 亚洲av激情无码专区在线播放| 久久久久亚洲AV无码专区首| 亚洲国产国产综合一区首页| 色婷婷亚洲十月十月色天| 婷婷久久久亚洲欧洲日产国码AV| 亚洲国产精品久久66| 亚洲香蕉免费有线视频| 亚洲国产中文在线视频| 自拍偷区亚洲国内自拍| 亚洲成a∧人片在线观看无码| 国产精品成人亚洲| 亚洲美女在线国产| 亚洲人成网7777777国产| 亚洲AV无码专区亚洲AV伊甸园| 亚洲国产精品久久| 亚洲伊人精品综合在合线| 亚洲午夜成人精品无码色欲| 亚洲欧美在线x视频| 成人亚洲性情网站WWW在线观看| 亚洲国产AV无码专区亚洲AV| 亚洲视频2020| 亚洲最大成人网色香蕉| 亚洲AV无码一区二区一二区| 亚洲裸男gv网站|