什么是Java序列化?

  • Post category:Java

Java序列化是指将一个Java对象转换为字节流,便于在网络传输和存储中使用。序列化后,该字节流可以被传输到不同的机器上,同时可以被存储到文件或数据库中。Java序列化是Java语言中一个常用的功能。

序列化和反序列化的概念

Java序列化由两个重要的概念组成:序列化和反序列化。序列化是将Java对象转换成字节流,而反序列化则是将字节流转换为Java对象。序列化允许我们在不失去对象属性的前提下,传输或存储对象,将对象在不同机器之间的传输和存储变得更加方便。

如何进行Java序列化

Java序列化可以通过以下步骤进行:

步骤1:实现Serializable接口

要使Java对象能够被序列化,Java类必须实现Serializable接口。这个接口里没有任何需要实现的方法,只是作为一个标记接口来标识该类是可序列化的。

以下是一个例子:

import java.io.Serializable;

public class Person implements Serializable {
    private String name;
    private int age;
    //...构造函数和Getter/Setter方法 
}

在上面的例子中,我们实现了Serializable接口,自定义了一个Person类,并且声明了两个私有属性,name和age。

步骤2:创建ObjectOutputStream和FileOutputStream对象

要将Java对象序列化到文件中,您需要创建ObjectOutputStream对象,并将其连接到一个FileOutputStream。为此,您需要传递一个文件名作为参数来创建FileOutputStream对象,并将它传递给ObjectOutputStream构造函数。

以下是一个例子:

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

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

        try {
            FileOutputStream fileOut = new FileOutputStream("person.ser");
            ObjectOutputStream out = new ObjectOutputStream(fileOut);

            out.writeObject(person);

            out.close();
            fileOut.close();
            System.out.printf("Serialized data is saved in person.ser");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在上面的代码中,我们创建了一个名为“person.ser”的文件并将其用于存储序列化数据。我们创建了一个Person对象,将其序列化到了该文件中。要实现这个,我们使用了“FileOutputStream”和“ObjectOutputStream”类。

步骤3:创建ObjectInputStream和FileInputStream对象

反序列化一个Java对象也需要一些步骤。在Java中,我们需要创建一个ObjectInputStream对象,并连接它到FileInputStream对象。为此,我们需要传递一个文件名作为参数来创建FileInputStream对象,并将其传递给ObjectInputStream构造函数以创建ObjectInputStream对象。

以下是一个例子:

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

public class DeserializeDemo {
    public static void main(String[] args) {
        Person person = null;

        try {
            FileInputStream fileIn = new FileInputStream("person.ser");
            ObjectInputStream in = new ObjectInputStream(fileIn);

            person = (Person) in.readObject();

            in.close();
            fileIn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        System.out.println("Deserialized Person...");
        System.out.println("Name: " + person.getName());
        System.out.println("Age: " + person.getAge());
    }
}

在上面的代码中,我们首先创建了一个名为“person.ser”的文件来存储序列化数据。我们反序列化了该文件中的对象,并将其打印出来。要实现这一点,我们使用了FileInputStream和ObjectInputStream类。

两条示例说明

下面给出两个关于Java序列化的代码示例:

示例1:将Java对象序列化到文件中

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

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

        try {
            FileOutputStream fileOut = new FileOutputStream("person.ser");
            ObjectOutputStream out = new ObjectOutputStream(fileOut);

            out.writeObject(person);

            out.close();
            fileOut.close();
            System.out.printf("Serialized data is saved in person.ser");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

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 int getAge() {
        return age;
    }
}

在上面的例子中,我们创建了一个Person对象,将其序列化到了名为“person.ser”的文件中。然后,我们关闭ObjectOutputStream和FileOutputStream。

示例2:从文件中反序列化Java对象

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

public class DeserializeDemo {
    public static void main(String[] args) {
        Person person = null;

        try {
            FileInputStream fileIn = new FileInputStream("person.ser");
            ObjectInputStream in = new ObjectInputStream(fileIn);

            person = (Person) in.readObject();

            in.close();
            fileIn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        System.out.println("Deserialized Person...");
        System.out.println("Name: " + person.getName());
        System.out.println("Age: " + person.getAge());
    }
}

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 int getAge() {
        return age;
    }
}

在上面的例子中,我们读取了名为“person.ser”的文件,并将其反序列化成一个Person对象。我们将该对象的属性打印出来。我们关闭ObjectInputStream和FileInputStream。