news 2026/4/16 20:04:42

序列化与反序列化-流

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
序列化与反序列化-流

Java 中的序列化与反序列化

序列化(Serialization)和反序列化(Deserialization)是 Java 中非常重要的概念,它们主要用于将对象转换成可以存储或传输的格式,或者将这种格式转换回原来的对象。

1. 什么是序列化?

序列化是指将对象的状态转换为字节流的过程,这样可以将其保存到文件、数据库中,或者通过网络传输到其他地方。序列化的目的是将对象的数据持久化,使其能够跨进程、跨机器传输。

怎么解释-流-为序列化解释-CSDN博客-这篇文章

2. 什么是反序列化?

反序列化是序列化的逆过程,即将存储或传输的字节流数据恢复成 Java 对象。通过反序列化,我们可以将字节流转换回原始的对象,恢复对象的状态。

为什么需要序列化和反序列化?

在一些业务场景中,我们需要将对象的状态进行存储或传输,以便后续恢复或使用。例如:

  • 文件存储:将对象保存到文件中,下次程序启动时重新加载对象。

  • 网络通信:在分布式系统中,通过网络将对象从一台计算机传输到另一台计算机。

  • 深度复制:通过序列化和反序列化实现对象的深拷贝。

使用场景

  1. 网络通信:
    在分布式系统或客户端-服务器架构中,可能需要将对象通过网络传输。为了在不同的系统或不同的应用程序之间共享对象数据,我们可以通过序列化将对象转换为字节流,然后通过网络传输,接收方再通过反序列化恢复对象。

  2. 持久化存储:
    当我们需要将对象存储到文件、数据库等持久化介质时,可以将对象序列化为字节流,然后存储在磁盘上。下次需要读取这些对象时,可以将字节流反序列化为对象。

  3. 深拷贝:
    深拷贝是创建一个原对象的完全副本,而不只是复制引用。通过序列化和反序列化可以实现深拷贝,因为对象的所有属性(包括引用类型的属性)都会被序列化和反序列化。

如何实现序列化和反序列化?

1. 实现序列化:

在 Java 中,要让一个对象可以被序列化,类必须实现Serializable接口。这个接口是一个标记接口(没有任何方法),它的存在表示该类的对象可以被序列化。

import java.io.Serializable; public class Person implements Serializable { private String name; private int age; // 构造方法和 getter/setter 略 }
2. 序列化对象:

序列化的过程是将对象转换为字节流,可以通过ObjectOutputStream类来实现。

import java.io.FileOutputStream; import java.io.ObjectOutputStream; public class SerializationExample { public static void main(String[] args) throws Exception { Person person = new Person("John", 30); // 创建输出流,将对象写入文件 FileOutputStream fileOut = new FileOutputStream("person.ser"); ObjectOutputStream out = new ObjectOutputStream(fileOut); out.writeObject(person); // 序列化对象 out.close(); fileOut.close(); } }
3. 反序列化对象:

反序列化的过程是将字节流转换回对象,可以通过ObjectInputStream类来实现。

import java.io.FileInputStream; import java.io.ObjectInputStream; public class DeserializationExample { public static void main(String[] args) throws Exception { // 创建输入流,从文件读取字节流 FileInputStream fileIn = new FileInputStream("person.ser"); ObjectInputStream in = new ObjectInputStream(fileIn); // 反序列化对象 Person person = (Person) in.readObject(); in.close(); fileIn.close(); System.out.println(person.getName() + " - " + person.getAge()); } }

注意事项

  1. 序列化版本号(serialVersionUID):
    Java 的序列化机制通过serialVersionUID来确保反序列化时的兼容性。每次修改类时,如果类的结构发生变化(比如添加了字段),序列化版本号也需要修改,否则可能导致反序列化失败。

    private static final long serialVersionUID = 1L;
  2. 非序列化字段:
    如果类中的某些字段不需要序列化,可以使用transient关键字标记这些字段,表示这些字段不会被序列化。

    private transient String password;
  3. 性能:
    序列化和反序列化是相对较慢的操作,尤其是当对象非常复杂或数据量很大的时候。所以在性能敏感的场景中,要谨慎使用序列化,必要时可以考虑其他更高效的方式(如 JSON、Protocol Buffers 等)。

  4. 安全问题:
    反序列化过程中可能会引发一些安全问题,比如反序列化攻击。攻击者可以通过精心构造的字节流来破坏应用程序,导致内存泄漏、远程代码执行等问题。因此,在进行反序列化时,要确保数据的来源是可信的。

总结

  • 序列化是将对象转换为字节流的过程,通常用于将对象存储或传输。

  • 反序列化是将字节流转换回对象的过程,通常用于从存储中恢复对象。

  • 在 Java 中,通过实现Serializable接口并使用ObjectOutputStreamObjectInputStream来实现序列化和反序列化。

  • 序列化和反序列化广泛应用于网络通信、持久化存储和深拷贝等场景,但也需要注意性能和安全问题。

简单来说,当对象转换成流时,就是序列化的过程。

流(Stream)是指可以按顺序读取或写入的数据通道。通常在处理 I/O 操作时(如文件读写、网络传输等),我们会使用流来传输数据。在 Java 中,流和序列化紧密相关,尤其是在对象的存储和传输过程中。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 10:14:09

java list怎么进行group

在Java中&#xff0c;对List进行分组有多种方法&#xff0c;以下是常见的几种方式&#xff1a; 1. 使用 Stream API (Java 8 推荐) 1.1 按属性分组 // 按对象属性分组 List<Person> people Arrays.asList(new Person("Alice", "IT"),new Person(…

作者头像 李华
网站建设 2026/4/16 10:16:00

解放校园热水!蓝牙水控器开源项目深度解析

还在为宿舍热水系统烦恼吗&#xff1f;这款开源蓝牙控制方案让你彻底告别复杂的商业应用&#xff0c;实现校园热水系统的自主管理。无论你是技术小白还是开发高手&#xff0c;都能在5分钟内快速上手这款完全离线的校园热水解决方案。 【免费下载链接】waterctl 深圳市常工电子“…

作者头像 李华
网站建设 2026/4/16 10:16:36

鸣潮工具箱终极指南:快速解锁游戏性能潜能的完整方案

鸣潮工具箱终极指南&#xff1a;快速解锁游戏性能潜能的完整方案 【免费下载链接】WaveTools &#x1f9f0;鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools 还在为《鸣潮》游戏卡顿、画质不佳而烦恼吗&#xff1f;&#x1f9f0;鸣潮工具箱为你提供一…

作者头像 李华
网站建设 2026/4/15 22:16:14

Emby高级功能解锁全攻略:免费享受Premiere完整特性

Emby高级功能解锁全攻略&#xff1a;免费享受Premiere完整特性 【免费下载链接】emby-unlocked Emby with the premium Emby Premiere features unlocked. 项目地址: https://gitcode.com/gh_mirrors/em/emby-unlocked 想要零成本体验Emby Premiere的所有付费功能吗&…

作者头像 李华
网站建设 2026/4/15 15:18:10

XUnity.AutoTranslator:Unity游戏本地化终极解决方案

XUnity.AutoTranslator&#xff1a;Unity游戏本地化终极解决方案 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 还在为Unity游戏多语言适配而烦恼吗&#xff1f;XUnity.AutoTranslator作为业界领先的自动…

作者头像 李华
网站建设 2026/4/16 10:43:50

原神祈愿数据分析终极指南:3步导出完整抽卡记录

原神祈愿数据分析终极指南&#xff1a;3步导出完整抽卡记录 【免费下载链接】genshin-wish-export biuuu/genshin-wish-export - 一个使用Electron制作的原神祈愿记录导出工具&#xff0c;它可以通过读取游戏日志或代理模式获取访问游戏祈愿记录API所需的authKey。 项目地址:…

作者头像 李华