【Java 基础】29 序列化

2023-12-13 19:21:33

1.定义

序列化(Serialization)是将对象的状态转换为字节流的过程,以便将其存储到文件、数据库或通过网络传输

说简单点,序列化就是把一个对象转变为二进制的数据流

在这里插入图片描述

那么,与 序列化 相对于的还有 反序列化

反序列化是什么呢?它就是 序列化 的一个反向过程

在这里插入图片描述

2.目的

序列化的主要目的有两个 持久化通信

  • 持久化: 将对象的状态保存到磁盘或者数据库中,以便在程序重启时能够恢复对象的状态
  • 通信: 在分布式系统中,通过序列化可以将对象在网络上传输,实现远程调用或数据传递

3.使用

Java 提供了一个强大的序列化框架,使得开发者能够轻松地将对象序列化和反序列化。要实现序列化,类必须实现 java.io.Serializable 接口,这是一个标记接口,没有任何方法需要实现。

在这里插入图片描述

使用时,实现这个接口即可

import java.io.Serializable;

class Stu implements Serializable {
    private String name;
    private int age;

    public Stu(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "[name :" + name + ",age :" + age + "]";
    }
}

Java 使用 ObjectOutputStreamObjectInputStream 类来实现序列化和反序列化。

1)序列化

将 Stu 对象的信息 序列化 到 stuFile 文件中,以便保存

在这里插入图片描述

示例代码:

import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.nio.file.Files;
import java.nio.file.Paths;

public class Demo {
    public static void main(String[] args) throws Exception{
        Stu stu = new Stu("cheney", 18);
        ObjectOutputStream oos = new ObjectOutputStream(Files.newOutputStream(Paths.get("stuFile")));
        oos.writeObject(stu);
        System.out.println("学生类被序列化啦! 内容是 :" + stu );
    }
}

class Stu implements Serializable {
    private String name;
    private int age;

    public Stu(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "[name :" + name + ",age :" + age + "]";
    }
}

输出结果:

学生类被序列化啦! 内容是 :[name :cheney,age :18]

并生成了我们所指定的文件 stuFile

在这里插入图片描述

2)反序列化

将 stuFile 文件 中的 Stu 对象的信息 序列化 到内存中,以便再次使用

在这里插入图片描述

示例代码:

import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;

public class Demo {
    public static void main(String[] args) throws Exception{
        ObjectInputStream ois = new ObjectInputStream(Files.newInputStream(Paths.get("stuFile")));
        Stu stu = (Stu) ois.readObject();
        System.out.println("学生类被序列化啦! 内容是 :" + stu );
    }
}

class Stu implements Serializable {
    private String name;
    private int age;

    public Stu(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "[name :" + name + ",age :" + age + "]";
    }
}

输出结果:

学生类被序列化啦! 内容是 :[name :cheney,age :18]

3.应用场景

  • 对象持久化: 将对象的状态保存到文件系统,以便在程序重新启动时能够恢复对象的状态
  • 网络通信: 在分布式系统中,通过序列化可以将对象在网络上传输,实现远程调用或数据传递
  • 缓存: 将对象序列化后存储在缓存中,以减少对象的重复创建和初始化成本
  • 消息传递: 在消息传递系统中,通过序列化可以方便地将消息对象传递给其他系统或服务

4.注意事项

  • 版本兼容性: 序列化后的数据是与类的结构相关的,因此在进行序列化后,如果类的结构发生变化,反序列化可能会失败。为了解决这个问题,可以使用 serialVersionUID 静态变量来指定一个版本号

    private static final long serialVersionUID = 1L;
    
  • 敏感信息: 序列化的对象中可能包含敏感信息,如密码等。在实际应用中,应该谨慎考虑对象中是否包含敏感信息,如果有,应该采取相应的安全措施

  • 性能影响: 序列化和反序列化过程可能会对性能产生一定的影响,特别是当对象结构较为复杂时。在性能敏感的场景中,要谨慎使用序列化

  • 选择合适的序列化方式: Java 提供了多种序列化方式,如默认的 Java 序列化、JSON 序列化、XML 序列化等。根据实际需求选择合适的方式

总结

序列化是一种强大的工具,为开发者提供了方便的手段来实现对象的持久化、网络通信和消息传递。通过实现 Serializable 接口,我们可以轻松地将对象序列化和反序列化。在实际应用中,要注意版本兼容性、敏感信息的处理以及选择合适的序列化方式,以确保序列化的安全和高效。

文章来源:https://blog.csdn.net/yanyc0411/article/details/134906609
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。