1. 程式人生 > 其它 >java 序列化與反序列化

java 序列化與反序列化

1.序列化:

將java物件轉化為位元組序列

2.反序列化:

將位元組序列恢復成java物件

3.序列化是幹什麼的:

1.儲存在記憶體中的物件的狀態

2.方便傳輸,實現物件的位元組序列傳輸,如影象,視訊等

4.實現

java提供兩種方式一種是實現Serializable介面,另一種是實現Exteranlizable介面,使用Serializable時可利用transient關鍵子修飾不需要被反序列化的屬性,使用Exteranlizable介面時需要重寫writeExternal和readExternal方法

user類實現Serializable介面,實際為空介面,作為可反序列化標識

import
java.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()將序列化資料反序列化為物件