当前位置: 首页 > news >正文

29 - Java Serializable 序列化

Java的Serializable接口是Java序列化机制的核心,它允许一个对象的状态被转换为字节流,从而可以方便地进行存储或传输。
序列化后的对象可以被写到数据库、存储到文件系统,或者通过网络传输。
要在 Java 中使一个类可序列化,你需要让它实现 java.io.Serializable  接口。

一、什么是序列化?

序列化(Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。
在Java中,序列化通常指将对象转换为字节流,以便将其保存到文件、发送到另一个系统、或通过网络传输。
反序列化(Deserialization)则是将字节流转换回对应对象的过程。

二、Serializable接口

在Java中,要实现序列化,一个类必须实现java.io.Serializable接口。这个接口是一个“标记接口”,即它不包含任何方法,只是起到一个标记的作用,告诉Java编译器和运行时系统这个类的实例可以被序列化。

三、序列化的基本步骤

‌创建对象‌:首先,你需要有一个你想要序列化的对象。
‌创建输出流‌:然后,你需要创建一个输出流,通常是FileOutputStream,用于将序列化后的字节流写入文件或其他输出设备。
‌创建ObjectOutputStream‌:接下来,你需要创建一个ObjectOutputStream,它将负责将对象转换为字节流并写入输出流。
‌调用writeObject方法‌:使用ObjectOutputStream的writeObject方法将对象序列化并写入输出流。
‌关闭流‌:最后,关闭所有的流以释放资源。
反序列化的步骤类似,只是使用的是FileInputStream和ObjectInputStream,并调用readObject方法来读取和构造对象。

四、注意事项

‌serialVersionUID‌:每个可序列化的类都有一个serialVersionUID,它是一个版本控制的机制,用于验证序列化的对象版本和类定义是否匹配。如果两者不匹配,会抛出InvalidClassException。建议显式地定义这个字段,以避免因版本变化导致的问题。
‌transient关键字‌:如果有些字段不需要序列化,可以使用transient关键字修饰这些字段。被transient修饰的字段在序列化时会被忽略。
‌自定义对象的序列化‌:如果一个对象包含对其他对象的引用,那么这些对象也必须实现Serializable接口。否则,在序列化时会抛出NotSerializableException。
‌处理敏感数据‌:在序列化过程中,注意不要序列化包含敏感信息(如密码、密钥等)的对象。这些信息可能会在序列化后的字节流中暴露。
‌继承关系‌:如果一个类是可序列化的,那么它的所有子类也都是可序列化的,除非子类自己覆盖了序列化行为。
‌安全性‌:反序列化时应该特别小心,不要反序列化来自不信任来源的字节流。这可能会导致安全问题,如代码注入攻击。

五、高级特性

‌自定义序列化‌:通过实现readObject和writeObject方法,你可以自定义对象的序列化和反序列化过程。这在你需要控制序列化格式或处理复杂对象关系时非常有用。
‌替代序列化机制‌:除了Java原生的序列化机制外,还有一些替代的序列化库,如Google的Protocol Buffers、Apache的Thrift、Jackson和Gson等。这些库通常提供了更高效、更灵活的序列化方式,并且可以与多种编程语言互操作。
综上所述,Java的序列化机制是一个强大的工具,允许你方便地将对象的状态持久化或进行网络传输。然而,在使用它时也需要注意一些潜在的问题和限制,以确保序列化的正确性和安全性。

六、示例

要实现序列化,一个类必须实现 java.io.Serializable 接口。这个接口是一个“标记接口”,也就是说,它本身不包含任何方法,只是起到标记作用,告诉Java编译器和运行时环境这个类的实例可以被序列化。

实现Serializable接口

以下是一个简单的例子,展示了如何使一个类实现 Serializable 接口:
import java.io.Serializable;public class Person implements Serializable {private static final long serialVersionUID = 1L;private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Person{name='" + name + "', age=" + age + "}";}
}

序列化对象
要将对象序列化到文件中,可以使用 ObjectOutputStream 类:
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;public class SerializeDemo {public static void main(String[] args) {Person person = new Person("John Doe", 30);try (FileOutputStream fileOut = new FileOutputStream("person.ser");ObjectOutputStream out = new ObjectOutputStream(fileOut)) {out.writeObject(person);System.out.println("Serialized data is saved in person.ser");} catch (IOException i) {i.printStackTrace();}}
}

反序列化对象
要从文件中反序列化对象,可以使用 ObjectInputStream 类:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;public class DeserializeDemo {public static void main(String[] args) {Person person = null;try (FileInputStream fileIn = new FileInputStream("person.ser");ObjectInputStream in = new ObjectInputStream(fileIn)) {person = (Person) in.readObject();} catch (IOException i) {i.printStackTrace();} catch (ClassNotFoundException c) {System.out.println("Person class not found");c.printStackTrace();}System.out.println("Deserialized Person: " + person);}
}

注意事项

  • serialVersionUID‌::强烈建议为实现了 Serializable 接口的类添加一个 serialVersionUID 字段。这是一个版本控制的机制,用于验证序列化的对象版本和类定义是否匹配。如果不匹配,会抛出 InvalidClassException。
  • transient‌:如果有些字段不需要序列化,可以使用 transient 关键字修饰这些字段。
  • 处理自定义对象‌:如果一个对象包含对其他对象的引用,那么这些对象也必须实现 Serializable 接口。
  • 安全性‌:序列化可能带来安全问题,因为可以从字节流中构造对象。因此,反序列化时应该特别小心,不要反序列化不信任的数据源的对象。
通过实现 Serializable 接口,你可以方便地将对象的状态持久化或进行网络传输,但也要注意序列化的开销和潜在的安全问题。

相关文章:

29 - Java Serializable 序列化

Java的Serializable接口是Java序列化机制的核心,它允许一个对象的状态被转换为字节流,从而可以方便地进行存储或传输。 序列化后的对象可以被写到数据库、存储到文件系统,或者通过网络传输。 要在 Java 中使一个类可序列化,你需要…...

59 基于STM32的烟雾、红外、温湿度检测

所有仿真详情导航: PROTEUS专栏说明-CSDN博客 目录 一、主要功能 二、硬件资源 三、主程序编程 四、资源下载 一、主要功能 基于SMT32F103C8T6单片机,采用DHT11检测温湿度,采用光敏电阻检测光照,采用滑动变阻器分别模拟红外、烟雾,通过OLED显示屏显示,如果湿度过低…...

使用Excel 对S型曲线加减速算法进行仿真

项目场景: 项目场景:代码中写了S型加减速算法,相查看生成的加减速数组,直观的展示出来,USB通信一次64字节,对于我几个个32位的频率值不太方便,于是采用Excel进行仿真。 代码中如何生成S加减速曲…...

flink-connector-mysql-cdc:01 mysql-cdc础配置代码演示

flink-connector-mysql-cdc: 01 mysql-cdc基础配置代码演示02 mysql-cdc高级扩展03 mysql-cdc常见问题汇总04 mysql-cdc-kafka生产级代码分享05 flink-kafka-doris生产级代码分享06 flink-kafka-hudi生产级代码分享 flink-cdc版本:3.2.0 flink版本&…...

java计算机毕设课设—进销存管理系统(附源码、文章、相关截图、部署视频)

这是什么系统? 资源获取方式再最下方 java计算机毕设课设—进销存管理系统(附源码、文章、相关截图、部署视频) 一、项目简介 项目名称: 基于Java的进销存管理系统 开发背景: 在现代企业管理中,库存管理是核心环节之一&#…...

鸿蒙UI开发——渐变色效果

1、概 述 ArkTs可以通过颜色渐变接口,设置组件的背景颜色渐变效果,实现在两个或多个指定的颜色之间进行平稳的过渡。 目前提供三种渐变类型:线性渐变、角度渐变、径向渐变。 我们在鸿蒙UI布局实战 —— 个人中心页面开发中,默认…...

嵌入式硬件设计 — 智能设备背后的隐形架构大师

目录 引言 一、嵌入式硬件设计概述 (一)需求分析 (二)硬件选型 (三)电路设计 (四)PCB 制作与焊接 (五)硬件调试与测试 (六)软…...

QNX的系统资源访问机制

资料参考: QNX官网文档 在QNX中,一些系统的资源默认是无法访问的,或者可访问的范围过大,导致产生不可控的危险,此时便需要对系统资源进行访问限制 接口如下 #include <sys/rsrcdbmgr.h> #include <sys/rsrcdbmsg.h>int rsrcdbmgr_create(...

高校数字化运营平台解决方案:构建统一的服务大厅、业务平台、办公平台,助力打造智慧校园

教育数字化是建设教育强国的重要基础&#xff0c;利用技术和数据助推高校管理转型&#xff0c;从而更好地支撑教学业务开展。 近年来&#xff0c;国家多次发布政策&#xff0c;驱动教育行业的数字化转型。《“十四五”国家信息化规划》&#xff0c;推进信息技术、智能技术与教育…...

多模态大型语言模型MM-1.5采用数据驱动的方法,通过不断优化数据组合提高模型性能

多模态大型语言模型MM-1.5采用数据驱动的方法&#xff0c;通过不断优化数据组合提高模型性能 MM-1.5模型的设计核心在于其数据驱动的方法&#xff0c;这意味着模型的性能在很大程度上取决于所使用的数据类型和组合。这种方法的实施细节可以从以下几个方面来展开&#xff1a; …...

16 设计模式之适配器模式(充电器转换案例)

一、适配器模式的定义 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;常用于解决接口不兼容的问题。适配器模式通过引入一个“适配器”类&#xff0c;将一个接口转化为客户端期望的另一种接口&#xff0c;使得原本因接口不兼容而无法交互…...

基于Java Springboot在线招聘APP且微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 微信…...

多组学数据如何发表高分SCI论文,以RNA-Seq数据为例

随着高通量测序以及生物信息学的发展&#xff0c;R语言在生物大数据分析以及数据挖掘中发挥着越来越重要的作用。想要成为一名优秀的生物数据分析者与科研团队不可或缺的人才&#xff0c;除了掌握对生物大数据挖掘与分析技能之外&#xff0c;还要具备一定的统计分析能力与SCI论…...

Qt Designer Ui设计 功能增加

效果展示 输入密码&#xff0c;密码错误&#xff0c;弹出提示 密码正确&#xff0c;弹出提示并且关闭原窗口 代码&#xff08;只提供重要关键主代码&#xff09;lxh_log.py代码&#xff1a; import sysfrom PySide6.QtWidgets import QApplication, QWidget, QPushButtonfrom …...

【Android学习】2024最新版Android Studio安装与配置

准备工作 Windows系统的要求 一、下载 Android Studio官网&#xff1a;https://developer.android.google.cn/studio?hlen 今天是2024年9月27日&#xff0c;Android Studio已经更新到了Koala版本 直接下载 二、安装 笔者当前环境变量中配置的JDK版本为1.8 双击.exe文件运行…...

RabbitMQ延时队列

RabbitMQ延时队列 什么是延时队列 延时队列顾名思义&#xff0c;即放置在该队列里面的消息是不需要立即消费的&#xff0c;而是等待一段时间之后取出消费。 应用场景 场景一&#xff1a;在订单系统中&#xff0c;一个用户下单之后通常有30分钟的时间进行支付&#xff0c;如…...

a8204 基于微信小程序的音乐播放器微信小程序的研究与实现 服务器端Java+Mysql+Servlet 文档 源码

音乐播放微信小程序 1.项目描述2. 绪论3.项目功能4.界面展示5.源码获取 1.项目描述 随着科技的发展&#xff0c;手机在我们生活中起到了重要的作用。软件作为手机重要的一部分&#xff0c;用户体验显得尤为重要。微信小程序一起操作便捷、用户基数大、分享便利、既用即走等特点…...

游戏新纪元:用栈记录数据,轻松实现悔棋功能

游戏介绍 嘿&#xff0c;各位游戏爱好者们&#xff01;今天我要给大家介绍一款颠覆传统、创新十足的游戏项目。这款游戏不仅让你沉浸在紧张刺激的游戏世界中&#xff0c;还引入了前所未有的两大特色功能&#xff1a;记录游戏数据和轻松实现悔棋。 首先&#xff0c;让我们来聊…...

C/C++基础知识复习(36)

函数重载是指在同一作用域内&#xff0c;定义多个同名但参数列表不同的函数。通过函数重载&#xff0c;程序员可以使用相同的函数名称处理不同类型或数量的参数&#xff0c;而不需要为每种情况创建不同的函数名称。编译器根据函数调用时传递的参数类型和数量来决定调用哪个版本…...

JAVA |日常开发中连接Sqlite数据库详解

JAVA &#xff5c;日常开发中连接Sqlite数据库详解 前言一、SQLite 数据库概述1.1 定义与特点1.2 适用场景 二、Java 连接 SQLite 数据库的准备工作2.1 添加 SQLite JDBC 驱动依赖2.2 了解 JDBC 基础概念 三、建立数据库连接3.1 代码示例3.2 步骤解析 四、执行 SQL 语句4.1 创建…...

从CISCN2019华北赛区Web1看SQL注入的巧妙绕过技巧

1. 从CISCN2019华北赛区Web1看SQL注入的巧妙绕过技巧 在CTF比赛中&#xff0c;Web安全题目常常会设置各种过滤规则来阻止常见的攻击手法。CISCN2019华北赛区的Web1题目"Hack World"就是一个典型的例子&#xff0c;它通过组合过滤的方式限制了传统SQL注入手段。这道题…...

GEO 优化系统实战指南:从架构设计到算法落地

1. GEO优化系统架构设计实战 第一次接触GEO优化系统时&#xff0c;我被各种空间计算概念搞得晕头转向。直到真正动手搭建系统才发现&#xff0c;架构设计就像搭积木&#xff0c;只要掌握关键模块的组装逻辑&#xff0c;就能构建出稳定高效的地理优化引擎。下面分享我在多个项目…...

KiCanvas:浏览器中的KiCAD设计查看器,5分钟快速入门指南

KiCanvas&#xff1a;浏览器中的KiCAD设计查看器&#xff0c;5分钟快速入门指南 【免费下载链接】kicanvas The KiCAD web viewer 项目地址: https://gitcode.com/gh_mirrors/ki/kicanvas 想要在浏览器中直接查看KiCAD电路设计文件&#xff0c;无需安装任何软件&#xf…...

图结构AI Agent记忆机制深度解析:小白/程序员必备,收藏学习大模型前沿技术!

图结构AI Agent记忆机制深度解析&#xff1a;小白/程序员必备&#xff0c;收藏学习大模型前沿技术&#xff01; 本文深入解析了基于图结构的AI Agent记忆机制&#xff0c;揭示了LLM驱动AI Agent面临的三大局限&#xff1a;知识截断、工具 incompetence 和性能饱和。文章强调记…...

ArcGIS Desktop绘图工具条实战:从基础图形到专业地图注记的进阶指南

1. ArcGIS绘图工具条初探&#xff1a;你的地图设计起点 第一次打开ArcGIS Desktop的绘图工具条时&#xff0c;我就像拿到了一盒全新的彩色铅笔。这个看似简单的工具条&#xff0c;实际上包含了从基础绘图到专业地图注记的全套功能。绘图工具条位于软件界面顶部&#xff0c;右键…...

IntelliJ Conf:JetBrains Koog Java原生AI Agent框架实战

文章目录前言&#xff1a;Java程序员的"Agent焦虑"终于有解了认识Koog&#xff1a;不是又一个LangChain的Java版环境准备&#xff1a;5分钟让项目跑起来实战&#xff1a;从Hello World到智能客服第一步&#xff1a;定义工具&#xff08;Tool&#xff09;第二步&#…...

【国家级等保2.0合规必读】:Python扩展模块安全开发规范(含12项强制检查项+自动化检测脚本)

第一章&#xff1a;Python扩展模块安全开发概述Python 扩展模块&#xff08;C/C 编写的 .so/.dll 文件&#xff09;是提升性能、复用底层库或与系统交互的关键手段&#xff0c;但其直接操作内存、绕过 Python 运行时保护机制的特性&#xff0c;也使其成为安全风险的高发区。开发…...

大数据运维 | 项目一:大数据分布式集群搭建全攻略

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 前言 作为一名大数据运维工程师&#xff0c;你是否遇到过这样的问题&#xff1a; 问题场景描述1机器A可正常上网&#xff0c;但机器B无法连接网…...

Undecimus技术解析与实战指南:iOS 11-12.4设备越狱完全攻略

Undecimus技术解析与实战指南&#xff1a;iOS 11-12.4设备越狱完全攻略 【免费下载链接】Undecimus unc0ver jailbreak for iOS 11.0 - 12.4 项目地址: https://gitcode.com/gh_mirrors/un/Undecimus Undecimus作为一款针对iOS 11.0至12.4系统的开源越狱工具&#xff0c…...

告别裸机思维:在GD32单片机上用FreeRTOS管理多个传感器(附源码)

从裸机到多任务&#xff1a;GD32FreeRTOS传感器管理系统实战 在嵌入式开发中&#xff0c;当系统需要同时处理多个外设时&#xff0c;传统的裸机编程往往会陷入复杂的状态机迷宫。我曾在一个环境监测项目中深有体会——当温湿度传感器、光照传感器、按键和OLED显示屏需要协同工作…...