首頁  >  文章  >  Java  >  Java語言序列化與反序列化的實作方法

Java語言序列化與反序列化的實作方法

WBOY
WBOY原創
2023-06-10 21:33:42767瀏覽

Java語言是一種物件導向的程式語言,具有平台無關性、易學易用、可靠性高等特點。其中,物件的序列化和反序列化是Java語言中非常重要的一個功能,可以方便地將物件在不同JVM中傳輸或儲存。本文將介紹Java語言序列化和反序列化的實作方法。

一、序列化的概念

序列化是指將物件轉換為位元組序列的過程,使其可以在網路中傳輸或儲存。序列化的過程可以將Java物件轉換為一種通用的格式,例如XML、JSON、二進位流等,以便在不同的平台進行傳輸和處理。在Java語言中,序列化可以使用Java.io.Serializable介面實作。

二、Java.io.Serializable介面

Java.io.Serializable介面是Java語言提供的一個標記接口,用來標記一個類別能夠被序列化。只有實作了這個介面的類別才能進行序列化和反序列化操作。這個介面沒有實作任何方法,只是作為一個標記,告訴JVM這個類別是可序列化的。

實作Java.io.Serializable介面的類別必須滿足以下條件:
1.該類別必須是可序列化的,即其狀態可以寫入到位元組流中。
2.該類別必須有一個無參數建構子。
3.該類別的所有非靜態成員變數都必須是可序列化的。

例如,以下是實作Java.io.Serializable介面的類別的範例:

import java.io.Serializable;

public class Person implements Serializable {
    private String name; // 可序列化的成员变量
    private int age; // 可序列化的成员变量

    public Person(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; }
}

三、序列化的實作方法

Java語言中提供了兩種序列化的實作方法:Java.io.ObjectOutputStream類別和Java.io.ByteArrayOutputStream類別。

  1. Java.io.ObjectOutputStream類別

Java.io.ObjectOutputStream類別是Java語言提供的序列化類別。該類別提供了將Java物件序列化為位元組流的方法,並將這些位元組寫入OutputStream中的可能性。以下是將Person物件序列化為位元組流並寫入檔案中的方法範例:

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

public class SerializeDemo {
    public static void main(String[] args) {
        Person person = new Person("Tom", 20);

        try {
            FileOutputStream fos = new FileOutputStream("person.ser");
            ObjectOutputStream oos = new ObjectOutputStream(fos);

            oos.writeObject(person);

            oos.close();
            fos.close();

            System.out.println("Person对象已经序列化到person.ser中。");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  1. Java.io.ByteArrayOutputStream類別
##Java.io. ByteArrayOutputStream類別是Java語言提供的用於序列化的類別。這類提供了將Java物件序列化為位元組陣列的方法,並將這些位元組儲存到ByteArrayOutputStream中的可能性。以下是將Person物件序列化為位元組流並儲存在位元組數組中的方法範例:

import java.io.ByteArrayOutputStream;
import java.io.ObjectOutputStream;

public class SerializeDemo {
    public static void main(String[] args) {
        Person person = new Person("Tom", 20);

        try {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(bos);

            oos.writeObject(person);

            byte[] byteArray = bos.toByteArray();

            oos.close();
            bos.close();

            System.out.println("Person对象已经序列化到字节数组中。");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

四、反序列化的實作方法

Java語言中提供了兩種反序列化的實作方法:Java.io.ObjectInputStream類別和Java.io.ByteArrayInputStream類別。

    Java.io.ObjectInputStream類別
Java.io.ObjectInputStream類別是Java語言提供的反序列化類別。該類別提供了從InputStream中讀取位元組並將其反序列化為Java物件的方法。以下是將位元組流從檔案讀取並反序列化為Person物件的方法範例:

import java.io.FileInputStream;
import java.io.ObjectInputStream;

public class DeserializeDemo {
    public static void main(String[] args) {
        try {
            FileInputStream fis = new FileInputStream("person.ser");
            ObjectInputStream ois = new ObjectInputStream(fis);

            Person person = (Person) ois.readObject();

            ois.close();
            fis.close();

            System.out.println("从person.ser文件中反序列化出了一个Person对象。");
            System.out.println("Person对象的name是:" + person.getName());
            System.out.println("Person对象的age是:" + person.getAge());

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

    Java.io.ByteArrayInputStream類別
  1. ##Java. io.ByteArrayInputStream類別是Java語言提供的用於反序列化的類別。該類別提供了從位元組數組中讀取位元組並將其反序列化為Java物件的方法。以下是將位元組陣列反序列化為Person物件的方法範例:
import java.io.ByteArrayInputStream;
import java.io.ObjectInputStream;

public class DeserializeDemo {
    public static void main(String[] args) {
        try {
            Person person = null;
            byte[] byteArray = // 从其他途径获取的Person对象的字节数组

            ByteArrayInputStream bais = new ByteArrayInputStream(byteArray);
            ObjectInputStream ois = new ObjectInputStream(bais);

            person = (Person) ois.readObject();

            ois.close();
            bais.close();

            System.out.println("从字节数组中反序列化出了一个Person对象。");
            System.out.println("Person对象的name是:" + person.getName());
            System.out.println("Person对象的age是:" + person.getAge());

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

總之,Java語言的序列化和反序列化功能是非常重要的功能,可以方便地將物件在不同JVM中進行傳輸或儲存。透過實作Java.io.Serializable介面和使用Java.io.ObjectOutputStream類別和Java.io.ObjectInputStream類別來實現序列化和反序列化。同時,Java.io.ByteArrayOutputStream類別和Java.io.ByteArrayInputStream類別也可以實作這些操作。

以上是Java語言序列化與反序列化的實作方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn