专栏名称: 鸭哥聊Java
回复关键字:666 ,领取免费简历模板,Java面试题,Java编程视频等。本号内容涵盖Java源码,JVM源码,Dubbo源码,Spring源码,Spring Cloud微服务架构,分布式高并发架构技术,MySQL性能调优等。
目录
相关文章推荐
宁夏药安早知道  ·  我国海洋经济总量首超十万亿元 ·  22 小时前  
甘肃政务  ·  我国海洋经济总量首超十万亿元 ·  昨天  
安徽省发展改革委  ·  安徽省新能源汽车产业集群建设企业巡展——【2 ... ·  昨天  
安徽省发展改革委  ·  安徽省新能源汽车产业集群建设企业巡展——【2 ... ·  昨天  
地刊速览  ·  EPSL:古太平洋的缺氧事件 ·  昨天  
地刊速览  ·  EPSL:古太平洋的缺氧事件 ·  昨天  
51好读  ›  专栏  ›  鸭哥聊Java

阿里面试题:什么是序列化和反序列化,它们在 Java 中的应用是什么?

鸭哥聊Java  · 公众号  ·  · 2025-02-14 11:22

正文

今天我们来聊聊序列化和反序列化的概念。在实际开发中,这两个技术点特别重要,尤其是在涉及到对象的存储和网络传输时。

如果你想让 Java 对象能够持久化保存,或者通过网络进行传输,序列化和反序列化就是必不可少的基础知识。今天我就带大家深入浅出地了解一下这些概念,还会讲解代码示例,帮你彻底搞懂这些技术。

首先,我们得从基础说起。什么是序列化?它就是把一个对象转化成可以存储或传输的格式。比如你把一个 Java 对象转化为字节流,然后存到硬盘,或者通过网络发送出去。反过来说,反序列化就是把这个字节流重新转回成原始的 Java 对象,让它恢复成可以操作的状态。

在很多场景中,序列化和反序列化是不可避免的。举个简单的例子,当你需要将一个对象从客户端发送到服务器,或者从服务器发送到客户端时,你就需要先把对象序列化成字节流再发送出去。接收到的字节流再经过反序列化,恢复成原来的 Java 对象。

再举个例子,如果你想把对象存储到数据库里,通常也需要先将对象序列化。很多数据库(比如 Redis)会将数据存储为字节流,这时候反序列化就是将这些字节流还原成 Java 对象的过程。

那么,为什么 Java 需要序列化呢?简单来说,序列化有助于我们在不同系统之间交换数据。当数据需要从一台计算机传输到另一台计算机时,它必须被转换成一种标准化的格式。这种格式就好比是一个“共同语言”,让不同系统间能够理解彼此的消息。

比如你使用 RMI(远程方法调用)时,客户端和服务器之间的对象必须经过序列化和反序列化。网络通信使用的是字节流,Java 对象只能被序列化为字节流之后才能传输。因此,无论是通过网络发送数据,还是将对象持久化到硬盘或缓存中,序列化和反序列化都是必不可少的。

代码示例

为了让大家更清楚地理解序列化和反序列化,下面我提供一个简单的 Java 示例:

import java.io.*;

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

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

    @Override
    public String toString() {
        return "Person{name='" + name + "', age=" + age + "}";
    }
}

public class SerializationExample {
    public static void main(String[] args) {
        // 创建一个 Person 对象
        Person person = new Person("John"25);

        // 序列化
        try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("person.ser"))) {
            out.writeObject(person);
            System.out.println("对象已序列化!");
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 反序列化
        try (ObjectInputStream in = new ObjectInputStream(new FileInputStream("person.ser"))) {
            Person deserializedPerson = (Person) in.readObject();
            System.out.println("反序列化后的对象:" + deserializedPerson);
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

在这个例子中,我们定义了一个 Person 类,并让它实现 Serializable 接口。然后我们通过 ObjectOutputStream 对象将其序列化到文件 person.ser 中,再通过 ObjectInputStream 从文件中反序列化回来。这样就能看到序列化和反序列化的实际操作。

序列化的应用场景

序列化不仅仅用于对象的存储或传输,它还在很多其他的领域发挥着重要作用:

  1. 网络传输 :如前所述,序列化常见的应用场景就是在网络通信中传递对象。比如在远程方法调用(RMI)中,方法的参数和返回值往往是 Java 对象,这些对象需要经过序列化后才能通过网络传输。

  2. 缓存 :很多缓存系统(如 Redis)需要将对象序列化成字节流存储,获取数据时再进行反序列化。特别是分布式系统中,不同节点之间需要通过序列化传递数据。

  3. 持久化存储 :你可能会遇到一些需要将对象持久化存储的场景,比如将对象保存到文件中,然后稍后再恢复。序列化和反序列化在这种情况下也是必不可少的。

  4. Java 集群和分布式系统 :在分布式系统中,不同的 JVM 进程可能运行在不同的服务器上。通过序列化对象,进程间的通信变得可能,避免了操作系统平台之间的差异。

序列化协议与 TCP/IP 四层模型的关系

说到序列化协议和网络传输,可能有小伙伴会问: “序列化协议对应于 TCP/IP 4 层模型的哪一层?”

简单来说,序列化协议属于 TCP/IP 四层模型中的 应用层

  • 在 OSI 七层协议模型中,应用层负责与应用程序的数据交互。
  • 序列化和反序列化正是应用层的数据交换方式,它们帮助应用程序将对象数据以一种统一的格式进行处理和传输。因此,序列化协议自然属于应用层的一部分。

最后,我们来看一道面试题:

面试题: 什么是序列化和反序列化,它们在 Java 中的应用是什么?

答案:

序列化是将 Java 对象转化为字节流的过程,这样对象就可以保存到磁盘或通过网络传输。反序列化则是将字节流转换回原始的 Java 对象。

序列化和反序列化在很多场景下都非常有用,尤其是在分布式系统、远程方法调用、缓存以及持久化存储时。Java 中的 Serializable 接口提供了序列化的支持,只有实现了该接口的类才能被序列化。

在应用中,序列化常用于以下几种场景:

  • 网络通信:通过 RMI 或其他协议传递对象。
  • 缓存系统:将对象存储到缓存中,常用的如 Redis。
  • 文件存储:将对象序列化到磁盘,稍后再进行反序列化。

反序列化是序列化的逆操作,它帮助我们恢复对象的状态。无论是传输数据还是持久化存储,序列化和反序列化都是非常重要的基础技术。







请到「今天看啥」查看全文