news 2026/4/16 4:49:29

流-为序列化解释

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
流-为序列化解释

流(Stream)是什么?

流(Stream)是 Java 中用来处理输入和输出(I/O)操作的基本抽象,它可以用来读取和写入数据。流分为两种:

  • 字节流(Byte Stream):用于处理原始二进制数据,如文件、图片等。

  • 字符流(Character Stream):用于处理字符数据,支持对字符数据的编码和解码。

在序列化和反序列化的过程中,我们主要使用字节流。特别是在将对象写入到文件、网络或数据库时,会用到ObjectOutputStreamObjectInputStream这两个类,它们分别属于字节流的一部分。

什么时候会用到流?

在实际开发中,流常用于以下几个场景:

1.文件操作:
  • 读取和写入文件:在开发中,常常需要将对象保存到文件中,或者从文件中读取对象数据。这时我们就会用到流,结合序列化来实现对象的持久化。

示例:将对象写入文件:

import java.io.*; public class FileExample { public static void main(String[] args) throws IOException { Person person = new Person("Alice", 30); // 序列化:将对象写入文件 FileOutputStream fileOut = new FileOutputStream("person.ser"); ObjectOutputStream out = new ObjectOutputStream(fileOut); out.writeObject(person); // 对象序列化到文件 out.close(); fileOut.close(); // 反序列化:从文件读取对象 FileInputStream fileIn = new FileInputStream("person.ser"); ObjectInputStream in = new ObjectInputStream(fileIn); Person deserializedPerson = (Person) in.readObject(); in.close(); fileIn.close(); System.out.println(deserializedPerson); } }

在这个例子中,ObjectOutputStream用来将person对象序列化并写入文件,而ObjectInputStream用来从文件中读取并反序列化回原始对象。

2.网络传输:
  • 客户端与服务器之间的数据传输:在分布式系统中,客户端和服务器之间需要通过网络传输数据。如果传输的是对象,那么对象必须先序列化为字节流,才能通过网络发送。接收端收到数据后再反序列化还原为对象。

示例:假设有一个简单的客户端和服务器,客户端将对象发送给服务器:

// 客户端发送对象 Socket socket = new Socket("localhost", 8080); ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream()); Person person = new Person("Bob", 25); out.writeObject(person); // 序列化对象并发送 out.close(); socket.close(); // 服务器接收对象 ServerSocket serverSocket = new ServerSocket(8080); Socket clientSocket = serverSocket.accept(); ObjectInputStream in = new ObjectInputStream(clientSocket.getInputStream()); Person receivedPerson = (Person) in.readObject(); // 反序列化对象 System.out.println("Received person: " + receivedPerson); in.close(); clientSocket.close(); serverSocket.close();

这个例子演示了如何通过ObjectOutputStream将一个对象通过网络发送给服务器,并使用ObjectInputStream从网络读取并反序列化对象。

3.数据库存储(持久化)
  • 对象持久化:在一些情况下,我们需要将对象的数据存储到数据库中。这时候,我们可能会使用流(通过序列化)来将对象转化为二进制数据,并存入数据库的 BLOB 字段(大二进制对象)。当需要读取对象时,再从数据库中获取二进制数据,通过反序列化将其恢复为 Java 对象。

示例:假设我们需要将一个Person对象存储到数据库中的 BLOB 字段:

// 将对象序列化并存储到数据库 String sql = "INSERT INTO persons (data) VALUES (?)"; PreparedStatement statement = connection.prepareStatement(sql); ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(byteArrayOut); out.writeObject(person); byte[] personData = byteArrayOut.toByteArray(); statement.setBytes(1, personData); statement.executeUpdate();

读取时,我们可以通过ObjectInputStream将字节流反序列化回对象:

// 从数据库中读取对象并反序列化 String sql = "SELECT data FROM persons WHERE id = ?"; PreparedStatement statement = connection.prepareStatement(sql); ResultSet rs = statement.executeQuery(); if (rs.next()) { byte[] personData = rs.getBytes("data"); ByteArrayInputStream byteArrayIn = new ByteArrayInputStream(personData); ObjectInputStream in = new ObjectInputStream(byteArrayIn); Person person = (Person) in.readObject(); System.out.println(person); }
4.会话管理:
  • 在 Web 应用中,使用HttpSession来保存用户的会话信息。在某些情况下(如保存用户对象),你可能需要将 Java 对象序列化成字节流存入会话中,或者从会话中读取并反序列化。

例如,存储用户登录信息:

HttpSession session = request.getSession(); User user = new User("john", "password123"); session.setAttribute("user", user); // 将对象存入会话,自动序列化

当需要使用该信息时,可以从会话中取出对象:

User user = (User) session.getAttribute("user"); // 获取并反序列化对象

总结:

流主要用于以下几种场景:

  • 文件操作:将对象存储到文件或从文件读取。

  • 网络传输:通过网络发送和接收对象。

  • 数据库存储:将对象序列化为字节流并存入数据库,或从数据库中读取字节流并反序列化。

  • 会话管理:在 Web 应用中,将对象存储到用户会话中。

在这些场景中,使用是为了处理数据的输入输出操作,而序列化反序列化则是将 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。 项目地址:…

作者头像 李华