1、Java中的序列化和反序列化是什么?

news2025/1/4 15:06:46

在Java中,序列化(Serialization)和反序列化(Deserialization)是两个常用于将对象转换为字节流或将字节流转换为对象的过程。它们主要用于对象的持久化存储、网络传输和远程通信等场景。下面详细解释这两个概念。

1. 序列化(Serialization)

序列化是指将对象的状态(包括对象的字段值)转换为一系列字节的过程。这些字节可以保存到文件中、通过网络发送,或者保存到内存中,以便后续还原成原始对象。

  • 目的:将对象转换为字节流,方便存储和传输。
  • 过程:对象被转换成字节流后,可以将字节流存储到文件、数据库或通过网络传输。
如何进行序列化?

要使一个Java对象可序列化,需要让该对象所属的类实现java.io.Serializable接口。这个接口本身不需要定义任何方法,只是一个标记接口,表示该类的对象是可以序列化的。

import java.io.Serializable;

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

    // Constructor, getters and setters
}
  • 任何实现了Serializable接口的类的对象都可以被序列化。
  • transient关键字:如果类中的某个字段不希望被序列化,可以使用transient关键字标记该字段,这样该字段在序列化时会被忽略。
public class Person implements Serializable {
    private String name;
    private transient int age;  // 这个字段不会被序列化

    // Constructor, getters and setters
}
序列化的示例
import java.io.*;

public class SerializeExample {
    public static void main(String[] args) {
        Person person = new Person("John", 25);
        
        try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("person.ser"))) {
            out.writeObject(person);  // 将对象写入文件
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在这个例子中,Person对象会被序列化,并保存到文件person.ser中。

2. 反序列化(Deserialization)

反序列化是指将字节流还原为原始对象的过程。通过反序列化,可以将存储或传输的字节流重新构造为一个原始的Java对象。

反序列化的示例
import java.io.*;

public class DeserializeExample {
    public static void main(String[] args) {
        try (ObjectInputStream in = new ObjectInputStream(new FileInputStream("person.ser"))) {
            Person person = (Person) in.readObject();  // 从文件中读取对象并反序列化
            System.out.println("Name: " + person.getName());
            System.out.println("Age: " + person.getAge());
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

在这个例子中,person.ser文件中的字节流被反序列化为一个Person对象,并打印其属性。

3. 序列化和反序列化的应用场景

  • 对象持久化:将对象存储到文件或数据库中,可以在需要时恢复对象状态。
  • 远程通信:通过网络传输对象(例如,RMI远程方法调用)。
  • 会话管理:在Web应用中,序列化对象可以用于会话存储(例如,HttpSession)。
  • 缓存:将对象序列化存储在内存中(例如,使用Redis存储Java对象)。

4. 序列化的版本控制

在序列化过程中,Java会为每个序列化类自动生成一个版本标识符(serialVersionUID)。它是一个长整型的ID,帮助确保在反序列化时,读取的类版本与当前类兼容。如果版本不一致,反序列化会抛出InvalidClassException异常。

如何设置 serialVersionUID
public class Person implements Serializable {
    private static final long serialVersionUID = 1L;  // 明确指定序列化版本

    private String name;
    private int age;

    // Constructor, getters and setters
}

如果没有显式指定serialVersionUID,Java会根据类的内容自动生成一个。但为了避免类发生变更时的兼容性问题,建议手动定义serialVersionUID

5. 注意事项

  • 兼容性:如果类的结构发生了改变(例如,添加或删除字段),序列化的兼容性可能会受到影响。这就是为什么serialVersionUID对于版本控制非常重要。
  • 性能:序列化过程涉及到I/O操作,所以在大规模对象或频繁序列化的场景下,性能可能是一个问题。需要优化和考虑使用压缩等技术。
  • 安全性:反序列化操作存在安全风险,恶意构造的序列化数据可能导致应用程序遭受攻击。确保反序列化的对象来源可信,并且尽量避免使用不受信任的反序列化流。

总结

  • 序列化:将对象转换为字节流,方便存储或传输。
  • 反序列化:将字节流恢复为原始对象。
  • 实现接口:Java中的对象必须实现Serializable接口才能被序列化。
  • 版本控制:使用serialVersionUID来控制类的版本兼容性。

这些概念是Java中处理对象存储和远程传输的重要机制,广泛应用于各种开发场景中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2269334.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

sentinel-请求限流、线程隔离、本地回调、熔断

请求限流:控制QPS来达到限流的目的 线程隔离:控制线程数量来达到限流的目录 本地回调:当线程被限流、隔离、熔断之后、就不会发起远程调用、而是使用本地已经准备好的回调去提醒用户 服务熔断:熔断也叫断路器,当失败、…

体验Cursor一段时间后的感受和技巧

用这种LLM辅助的IDE一段时间了,断断续续做了几个小项目了,总结一下整体的感受和自己的一些使用经验。 从Cursor开始又回到Cursor 第一个真正开始使用的LLM的辅助开发IDE就是Cursor,Github的Copilot支持尝试过,但是并没有真正的在…

【数据仓库】hadoop3.3.6 安装配置

文章目录 概述下载解压安装伪分布式模式配置hdfs配置hadoop-env.shssh免密登录模式设置初始化HDFS启动hdfs配置yarn启动yarn 概述 该文档是基于hadoop3.2.2版本升级到hadoop3.3.6版本,所以有些配置,是可以不用做的,下面仅记录新增操作&#…

宽带、光猫、路由器、WiFi、光纤之间的关系

1、宽带(Broadband) 1.1 宽带的定义宽带指的是一种高速互联网接入技术,通常包括ADSL、光纤、4G/5G等不同类型的接入方式。宽带的关键特点是能够提供较高的数据传输速率,使得用户可以享受到稳定的上网体验。 1.2 宽带的作用宽带是…

[2025] 如何在 Windows 计算机上轻松越狱 IOS 设备

笔记 1. 首次启动越狱工具时,会提示您安装驱动程序。单击“是”确认安装,然后再次运行越狱工具。 2. 对于Apple 6s-7P和iPad系列(iOS14.4及以上),您应该点击“Optinos”并勾选“允许未经测试的iOS/iPadOS/tvOS版本”&…

Linux SVN下载安装配置客户端

参考: linux下svn服务器搭建及使用(包含图解)_小乌龟svn新建用户名和密码-CSDN博客 1.ubuntu安装svn客户端 “subversion” sudo apt-get update sudo apt-get install subversion 查看安装的版本信息,同时看是否安装成功 s…

【Windows】Windows系统查看目录中子目录占用空间大小

在对应目录下通过powershell命令查看文件夹及文件大小,不需要管理员权限。 以下为方式汇总: 方式1(推荐,免费下载使用,界面友好): 使用工具以下是一些第三方工具treesize_free https://www.ja…

【论文阅读笔记】IceNet算法与代码 | 低照度图像增强 | IEEE | 2021.12.25

目录 1 导言 2 相关工作 A 传统方法 B 基于CNN的方法 C 交互方式 3 算法 A 交互对比度增强 1)Gamma estimation 2)颜色恢复 3)个性化初始η B 损失函数 1)交互式亮度控制损失 2)熵损失 3)平滑损失 4)总损失 C 实现细节 4 实验 5 IceNet环境配置和运行 1 下载…

L25.【LeetCode笔记】 三步问题的四种解法(含矩阵精彩解法!)

目录 1.题目 2.三种常规解法 方法1:递归做 ​编辑 方法2:改用循环做 初写的代码 提交结果 分析 修改后的代码 提交结果 for循环的其他写法 提交结果 方法3:循环数组 提交结果 3.方法4:矩阵 算法 代码实践 1.先计算矩阵n次方 2.后将矩阵n次方嵌入递推式中 提…

小白投资理财 - 看懂 PE Ratio 市盈率

小白投资理财 - 看懂 PE Ratio 市盈率 什么是 PE RatioPE 缺陷PE 优点总结 无论是在菜市还是股票市场,每个人都想捡便宜,而买股票就像市场买菜,必须货比三家,投资股票最重要就是要知道回本时间要多久,市场上很多时候散…

python利用selenium实现大麦网抢票

大麦网(damai.cn)是中国领先的现场娱乐票务平台,涵盖演唱会、音乐会、话剧、歌剧、体育赛事等多种门票销售。由于其平台上经常会有热门演出,抢票成为许多用户关注的焦点。然而,由于票务资源的有限性,以及大…

SQL-leetcode-183. 从不订购的客户

183. 从不订购的客户 Customers 表: -------------------- | Column Name | Type | -------------------- | id | int | | name | varchar | -------------------- 在 SQL 中,id 是该表的主键。 该表的每一行都表示客户的 ID 和名称。 Orders 表&#…

充电桩语音提示芯片方案-支持平台自定义语音NV128H让充电更便捷

随着工业化与城市化进程的加速推进,传统燃油汽车的数量急剧攀升,这直接导致了石油资源的过度开采与消耗。石油,作为不可再生的化石燃料,其储量日益枯竭,价格波动频繁,给全球能源安全带来了前所未有的挑战。…

Android 旋转盘导航栏

1.直接上源码: package com.you.arc;import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Point; import android.graphics.RectF; import android.support…

手搓一个ChatUI需要分几步

只关注项目代码的同学可以直接跳转目录中的正文部分,查看项目仓库和功能介绍。 引言 Chatbot的UI界面设计,是和传统软件不同的:都是当面一个简洁的对话框,框里预备着热乎的工具,可以随时更新。 像我这样做工的牛马&a…

低代码开发深度剖析:JNPF 如何引领变革

在当今数字化转型加速的时代,低代码开发已成为众多企业提升效率、降低成本的关键利器。它打破了传统开发模式的高门槛和冗长流程,让应用开发变得更加高效、灵活与普惠。 低代码开发的核心优势 低代码开发平台通过可视化的操作界面,减少了对…

uniapp实现APP、小程序与webview页面间通讯

需求: 1、需要在Uniapp开发的APP或小程序页面嵌入一个H5网页,需要拿到H5给APP传递的数据。 2、并且这个H5是使用vuevant开发的。(其实跟使用uniapp开发H5一样) 实现步骤: 1、首先需要兼容多端和App端,因…

网络游戏之害

网络游戏之害: 网络游戏于今之世风靡四方,其娱人耳目、畅人心怀之效,固为人知,然所藏之害,若隐伏之暗潮,汹涌而至时,足以覆舟,尤以青年为甚,今且缕析其害,以…

数据库的创建与删除:理论与实践

title: 数据库的创建与删除:理论与实践 date: 2024/12/31 updated: 2024/12/31 author: cmdragon excerpt: 在当今的数字时代,数据的管理和存储变得尤为重要。数据库作为数据存储的结构化方案,为数据的增删改查提供了系统化的方法。在一个典型的数据库管理系统中,创建和…

【电机控制】基于STC8H1K28的六步换向——方波驱动(软件篇)

【电机控制】基于STC8H1K28的六步换向——方波驱动(软件篇) 文章目录 [TOC](文章目录) 前言一、main.c二、GPIO.c三、PWMA.c四、ADC.c五、CMP.c六、Timer.c七、PMSM.c八、参考资料总结 前言 【电机控制】STC8H无感方波驱动—反电动势过零检测六步换向法 …