# Serialization 序列化

## 为什么需要序列化?

通过序列化能够实现对内存中的 对象对象进行持久化保存 或 网络传输。

无论是什么文件，通过序列化，最终都变成了字节流，能够以通用的格式进行传输或保存。

要想再次使用，就使用反序列化进行还原，对象还是对象，文件还是文件。

## Java 对象实现 序列化 与 反序列化

要想让某一个类支持 序列化 与反 序列化非常简单，只需要让这个类实现 Serializable 接口即可，我们只需要在类的声明时写上 implements Serializable 即可，不需要做额外修改(比如重写方法)。

#### 我们定义一个 Student 类:&#x20;

```java
public class Student implements Serializable {

    private int id;
    private String name;

    public Student(int id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}
```

#### 随后进行序列化和反序列化操作:&#x20;

```java
// 对 Student 进行 序列化 和 反序列化
public class SerializationTest {

    public static void main(String[] args) {
        Student stu1=new Student(20210010,"Tom");

        //序列化
        try {
            FileOutputStream fos = new FileOutputStream("Tom.txt");
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(stu1);
            //清空缓冲,关闭窗口
            fos.flush();
            oos.flush();
            fos.close();
            oos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        //反序列化
        try {
            FileInputStream fis=new FileInputStream("Tom.txt");
            ObjectInputStream ois = new ObjectInputStream(fis);
            Student stu2 = (Student)ois.readObject();
            //关闭窗口
            fis.close();
            ois.close();
            System.out.println(stu2);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

    }
}

```

#### 在序列化过程中, 我们额外用到了两个类：&#x20;

* FileOutputStream,  文件输出流，用来指定输出文件的名称
* ObjectOutputStream, 对象输出流，将对象写入文件中

#### 在反序列化过程中, 我们额外用到了两个类：&#x20;

* FileInputStream,  文件输入流，用来指定读取文件的名称
* ObjectInputStream, 对象输入流，将对象读到程序中

特别说明, **在输出缓冲流关闭前需要将缓冲清空, 也就是将缓冲区的内存释放调。**
