【Java 基础】Java 序列化和反序列化

骑猪看日落 2024-05-04 08:05 157阅读 0赞

在这里插入图片描述

?博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主

⛪️ 个人社区:个人社区
? 个人主页:个人主页
? 专栏地址: ✅ Java 进阶之路
?八股文专题:剑指大厂,手撕 Java 八股文

文章目录

      • 一、什么是序列化
      • 二、什么是反序列化
      • 三、序列化和反序列化的作用
      • 四、序列化和反序列化应用案例
      • 五、序列化和反序列化案例代码

一、什么是序列化

序列化是指将对象转化为字节流的过程,以便于存储或传输。在序列化过程中,对象的状态被保存为一连串的字节,可以将这些字节保存到文件中或通过网络传输。序列化后的字节流可以在需要时进行反序列化,将字节流重新转化为对象,并恢复对象的状态。

在Java中,对象的序列化是通过实现Serializable接口来实现的。Serializable接口是一个标记接口,没有任何方法,只是用于标识一个类可以被序列化。当一个类实现了Serializable接口,它的对象就可以被序列化为字节流。

序列化在很多场景中都有应用,例如在分布式系统中,可以将对象序列化后通过网络传输,或者将对象存储到缓存中。但需要注意的是,序列化和反序列化可能会引发安全问题,因此在进行序列化和反序列化操作时,要谨慎处理。

二、什么是反序列化

反序列化是指将字节流转化为对象的过程,与序列化相反。在反序列化过程中,字节流被重新组装成对象,并恢复对象的状态。在Java中,反序列化是通过ObjectInputStream类来实现的。ObjectInputStream类提供了readObject()方法,用于从输入流中读取对象。

反序列化是序列化的逆过程,可以将序列化后的字节流重新转化为原始的对象。这在很多场景中都有应用,例如在分布式系统中,可以将序列化后的对象通过网络传输,然后在接收方进行反序列化,恢复原始的对象。需要注意的是,在进行反序列化操作时,需要确保序列化和反序列化的版本一致,否则可能会出现不兼容的问题。

三、序列化和反序列化的作用

序列化和反序列化是用于在Java中将对象转换为字节流并从字节流中恢复对象的过程。它们的作用主要有以下几个方面:

  1. 数据持久化:通过序列化,可以将对象转换为字节流并保存到文件系统或数据库中。这样可以实现数据的持久化存储,方便后续的读取和使用。
  2. 对象传输:通过序列化,可以将对象转换为字节流,并在网络中传输。这在分布式系统、远程方法调用等场景中非常常见。发送方将对象序列化为字节流,通过网络发送给接收方,接收方再通过反序列化将字节流转换为对象。
  3. 缓存机制:序列化可以用于缓存机制,将对象序列化后存储在缓存中,以提高系统性能和响应速度。当需要使用对象时,可以直接从缓存中反序列化获取对象,避免了频繁的数据库访问或计算操作。
  4. 跨平台和跨语言通信:通过序列化,可以将对象转换为字节流,使得对象在不同的平台和不同的编程语言之间进行通信成为可能。只要各方都能正确地进行序列化和反序列化操作,就可以实现跨平台和跨语言的通信。

序列化和反序列化提供了一种方便的方式来将对象转换为字节流,并在需要时恢复为原始对象。它们在数据持久化、对象传输、缓存机制以及跨平台和跨语言通信等方面都有广泛的应用。

四、序列化和反序列化应用案例

序列化和反序列化在实际应用中有很多用途,以下是一些常见的应用案例:

  1. 数据库缓存:在Web应用中,为了提高性能,我们通常会将一些经常使用的数据缓存到内存中,以减少数据库的访问次数。这时,我们可以将数据对象序列化为字节流,存储到缓存中。当需要使用数据时,我们可以从缓存中读取字节流,并反序列化为对象,以提高访问速度。
  2. 分布式系统通信:在分布式系统中,不同的节点之间需要进行通信,传递数据对象是非常常见的操作。这时,我们可以将数据对象序列化为字节流,并通过网络传递。接收方再将字节流反序列化为对象,以获取数据。
  3. 消息队列:消息队列是一种常用的异步通信方式,可以将消息对象序列化为字节流,放入消息队列中。消费者再从消息队列中获取字节流,并反序列化为对象,以获取消息内容。
  4. 远程方法调用:在分布式系统中,我们通常需要调用远程节点的方法。这时,我们可以将方法参数对象序列化为字节流,通过网络传递给远程节点,并在远程节点上反序列化为对象,以调用方法。
  5. 对象持久化:在一些应用中,我们需要将数据对象持久化到磁盘中,以便下次启动应用时能够恢复数据。这时,我们可以将数据对象序列化为字节流,存储到磁盘中。下次启动应用时,我们可以从磁盘中读取字节流,并反序列化为对象,以恢复数据。

序列化和反序列化在很多应用场景中都有广泛的应用,可以方便地将对象转换为字节流,并在需要时恢复为原始对象。

五、序列化和反序列化案例代码

以下是一些常见的序列化和反序列化案例代码:

  1. Java中使用序列化和反序列化:

    import java.io.*;

    public class SerializationExample {

    1. public static void main(String[] args) {
    2. // 序列化对象
    3. try {
    4. // 创建对象
    5. MyClass obj = new MyClass("example", 123);
    6. // 序列化对象到文件
    7. FileOutputStream fileOut = new FileOutputStream("object.ser");
    8. ObjectOutputStream out = new ObjectOutputStream(fileOut);
    9. out.writeObject(obj);
    10. out.close();
    11. fileOut.close();
    12. System.out.println("对象已序列化");
    13. } catch (IOException e) {
    14. e.printStackTrace();
    15. }
    16. // 反序列化对象
    17. try {
    18. // 从文件读取对象
    19. FileInputStream fileIn = new FileInputStream("object.ser");
    20. ObjectInputStream in = new ObjectInputStream(fileIn);
    21. MyClass obj = (MyClass) in.readObject();
    22. in.close();
    23. fileIn.close();
    24. // 使用反序列化后的对象
    25. System.out.println("反序列化对象:");
    26. System.out.println("字符串属性:" + obj.getStringProperty());
    27. System.out.println("整数属性:" + obj.getIntegerProperty());
    28. } catch (IOException | ClassNotFoundException e) {
    29. e.printStackTrace();
    30. }
    31. }

    }

    class MyClass implements Serializable {

    1. private String stringProperty;
    2. private int integerProperty;
    3. public MyClass(String stringProperty, int integerProperty) {
    4. this.stringProperty = stringProperty;
    5. this.integerProperty = integerProperty;
    6. }
    7. public String getStringProperty() {
    8. return stringProperty;
    9. }
    10. public int getIntegerProperty() {
    11. return integerProperty;
    12. }

    }

精彩专栏推荐订阅:在下方专栏??
✅ 2023年华为OD机试真题(A卷&B卷)+ 面试指导
✅ 精选100套 Java 项目案例
✅ 面试需要避开的坑(活动)
✅ 你找不到的核心代码
✅ 带你手撕 Spring

?? 本文由激流原创,原创不易,希望大家关注、点赞、收藏,给博主一点鼓励,感谢!!!

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,157人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java序列序列

    遇到这个 Java Serializable 序列化这个接口,我们可能会有如下的问题 a,什么叫序列化和反序列化 b,作用。为啥要实现这个 Serializable 接