elasticsearch入門系列">elasticsearch入門系列
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.對象操作流練習
案例需求
創建多個學生類對象寫到文件中,再次讀取到內存中
實現步驟
創建序列化流對象
創建多個學生對象
將學生對象添加到集合中
將集合對象序列化到文件中
創建反序列化流對象
將文件中的對象數據,讀取到內存中
代碼實現
學生類
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
5G教育 Java
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。