首页 > 编程笔记 > Java笔记 阅读:12

Java对象序列化和反序列化(附带实例)

在 Java 中,ObjectOutputStream 类的对象用于序列化一个对象,ObjectInputStream 类的对象用于反序列化一个对象。ObjectOutputStream 类继承自 OutputStream 类,ObjectInputStream 类继承自 InputStream 类。

Java 程序中,一个类只有实现 Serializable 或 Externalizable 接口,才能被序列化或反序列化。Serializable 接口是一个标记接口。

例如,序列化一个 Book 类对象的代码如下:
import java.io.Serializable;
public class Book implements Serializable {
   
}
Java 负责处理从输入流中读取或者向输出流中写入 Serializable 对象的细节。

实现 Externalizable 接口能够更好地控制从输入流中读取对象和向输出流中写入对象。这是因为 Externalizable 接口继承了 Serializable 接口。Externalizable 接口的代码如下:
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.io.Serializable;

public interface Externalizable extends Serializable {
    void readExternal(ObjectInput in) throws IOException, ClassNotFoundException;
    void writeExternal(ObjectOutput out) throws IOException;
}
当从输入流中读取一个对象时,需要调用 readExternal() 方法;当向输出流中写入一个对象时,需要调用 writeExternal() 方法。

Book 类实现 Externalizable 接口的代码如下:
import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;

public class Book implements Externalizable {
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
    }
    public void writeExternal(ObjectOutput out) throws IOException {
    }
}

Java序列化对象

序列化一个 Book 类对象需要执行如下步骤:
依据上述步骤,在 Book.java 文字中编写 Book 类。代码如下:
import java.io.Serializable;

public class Book implements Serializable {
    private String name; // 书名
    private double price; // 价格

    public Book(String name, double price) { // 构造方法
        this.name = name;
        this.price = price;
    }

    @Override
    public String toString() { // 把书名和价格输出到控制台上
        return "Name:" + this.name + ", price: " + this.price;
    }
}

在 BookOutTest.java 文件中编写序列化 Book 类对象的代码。代码如下:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class BookOutTest {
    public static void main(String[] args) {
       Book book1 = new Book("Java基础教程", 49.9);
       Book book2 = new Book("C语言入门教程", 49.8);
       File fileObject = new File("book.ser");
       try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(fileObject))) {
           os.writeObject(book1);
           os.writeObject(book2);
           System.out.println(book1);
          System.out.println(book2);
       } catch (IOException e) {
           e.printStackTrace();
       }
   }
}
执行程序后,会把对象 book1 和 book2 各自的书名和价格输出到控制台上,并且把它们各自被序列化后的对象存储在当前项目文件夹下的 book.ser 文件中。

Java反序列化对象

反序列化一个 Book 类对象需要执行如下步骤:
依据上述步骤,在 Book.java 和 book.ser 都保持不变的情况下,在 BookInTest.java 文件中编写反序列化 Book 类对象的代码。代码如下:
import java.io.File;
import java.io.FileInputStream;
import java.io.ObjectInputStream;

public class BookInTest {
    public static void main(String[] args) {
        File fileObject = new File("book.ser");
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fileObject))) {
            Book book1 = (Book) ois.readObject();
            Book book2 = (Book) ois.readObject();
            System.out.println(book1);
            System.out.println(book2);
        } catch (Exception e){
            e.printStackTrace();
        }
    }
}
执行程序后,会发现被输出到控制台上的结果就是 book.ser 文件存储的序列化对象。

相关文章