java 序列化與反序列化
阿新 • • 發佈:2021-07-14
1.序列化:
將java物件轉化為位元組序列
2.反序列化:
將位元組序列恢復成java物件
3.序列化是幹什麼的:
1.儲存在記憶體中的物件的狀態
2.方便傳輸,實現物件的位元組序列傳輸,如影象,視訊等
4.實現
java提供兩種方式一種是實現Serializable介面,另一種是實現Exteranlizable介面,使用Serializable時可利用transient關鍵子修飾不需要被反序列化的屬性,使用Exteranlizable介面時需要重寫writeExternal和readExternal方法
user類實現Serializable介面,實際為空介面,作為可反序列化標識
importjava.io.Serializable; public class User implements Serializable { private String Name; private int age; public String getName() { return Name; } public void setName(String name) { Name = name; } public int getAge() { return age; }public void setAge(int age) { this.age = age; } public User(String name, int age) { Name = name; this.age = age; } }
Exteranlizable類繼承了Serializable需要實現writeExternal和readExternal方法,注意使用此方法時,若類沒有預設建構函式會報錯
import java.io.*; public class User implements Externalizable {private String Name; private int age; public String getName() { return Name; } public void setName(String name) { Name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public User(){ } public User(String name, int age) { Name = name; this.age = age; } @Override public void writeExternal(ObjectOutput out) throws IOException { out.writeObject(Name); out.writeObject(age); } @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { Name = (String) in.readObject(); age = (int) in.readObject(); } }
objectOutputStream物件輸出流 objectInputStream 物件輸入流
FileOutputStream 檔案輸出流 FileInputStream 檔案輸入流
利用兩者將物件的序列化資料寫入檔案,再從檔案中讀取序列化資料利用readObject恢復成物件
test類程式碼如下:
import java.io.*; public class test { public static void main(String[] args) throws IOException,ClassNotFoundException{ Serialize(); DeSerializ(); } private static void Serialize() throws IOException { FileOutputStream fos = new FileOutputStream("D://java test//Serial//1.txt"); ObjectOutputStream oos = new ObjectOutputStream(fos); User user1=new User("xxx",21); oos.writeObject(user1); System.out.print(oos); oos.flush(); oos.close(); } private static void DeSerializ() throws IOException, ClassNotFoundException { FileInputStream fis=new FileInputStream("D://java test//Serial//1.txt"); ObjectInputStream ois=new ObjectInputStream(fis); System.out.print(ois+"\n"); User user2=(User) ois.readObject(); System.out.print(user2.getName()+user2.getAge()); } }
執行Serialize()在1.txt中儲存序列化資料
執行DeSerializ()將序列化資料反序列化為物件