【Java 基础】29 序列化

文章目录

    • 1.定义
    • 2.目的
    • 3.使用
      • 1)序列化
      • 2)反序列化
    • 3.应用场景
    • 4.注意事项
    • 总结

1.定义

序列化(Serialization)是将对象的状态转换为字节流的过程,以便将其存储到文件、数据库或通过网络传输

说简单点,序列化就是把一个对象转变为二进制的数据流

在这里插入图片描述

那么,与 序列化 相对于的还有 反序列化

反序列化是什么呢?它就是 序列化 的一个反向过程

在这里插入图片描述

2.目的

序列化的主要目的有两个 持久化通信

  • 持久化: 将对象的状态保存到磁盘或者数据库中,以便在程序重启时能够恢复对象的状态
  • 通信: 在分布式系统中,通过序列化可以将对象在网络上传输,实现远程调用或数据传递

3.使用

Java 提供了一个强大的序列化框架,使得开发者能够轻松地将对象序列化和反序列化。要实现序列化,类必须实现 java.io.Serializable 接口,这是一个标记接口,没有任何方法需要实现。

在这里插入图片描述

使用时,实现这个接口即可

import java.io.Serializable;

class Stu implements Serializable {
    private String name;
    private int age;

    public Stu(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "[name :" + name + ",age :" + age + "]";
    }
}

Java 使用 ObjectOutputStreamObjectInputStream 类来实现序列化和反序列化。

1)序列化

将 Stu 对象的信息 序列化 到 stuFile 文件中,以便保存

在这里插入图片描述

示例代码:

import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.nio.file.Files;
import java.nio.file.Paths;

public class Demo {
    public static void main(String[] args) throws Exception{
        Stu stu = new Stu("cheney", 18);
        ObjectOutputStream oos = new ObjectOutputStream(Files.newOutputStream(Paths.get("stuFile")));
        oos.writeObject(stu);
        System.out.println("学生类被序列化啦! 内容是 :" + stu );
    }
}

class Stu implements Serializable {
    private String name;
    private int age;

    public Stu(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "[name :" + name + ",age :" + age + "]";
    }
}

输出结果:

学生类被序列化啦! 内容是 :[name :cheney,age :18]

并生成了我们所指定的文件 stuFile

在这里插入图片描述

2)反序列化

将 stuFile 文件 中的 Stu 对象的信息 序列化 到内存中,以便再次使用

在这里插入图片描述

示例代码:

import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;

public class Demo {
    public static void main(String[] args) throws Exception{
        ObjectInputStream ois = new ObjectInputStream(Files.newInputStream(Paths.get("stuFile")));
        Stu stu = (Stu) ois.readObject();
        System.out.println("学生类被序列化啦! 内容是 :" + stu );
    }
}

class Stu implements Serializable {
    private String name;
    private int age;

    public Stu(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "[name :" + name + ",age :" + age + "]";
    }
}

输出结果:

学生类被序列化啦! 内容是 :[name :cheney,age :18]

3.应用场景

  • 对象持久化: 将对象的状态保存到文件系统,以便在程序重新启动时能够恢复对象的状态
  • 网络通信: 在分布式系统中,通过序列化可以将对象在网络上传输,实现远程调用或数据传递
  • 缓存: 将对象序列化后存储在缓存中,以减少对象的重复创建和初始化成本
  • 消息传递: 在消息传递系统中,通过序列化可以方便地将消息对象传递给其他系统或服务

4.注意事项

  • 版本兼容性: 序列化后的数据是与类的结构相关的,因此在进行序列化后,如果类的结构发生变化,反序列化可能会失败。为了解决这个问题,可以使用 serialVersionUID 静态变量来指定一个版本号

    private static final long serialVersionUID = 1L;
    
  • 敏感信息: 序列化的对象中可能包含敏感信息,如密码等。在实际应用中,应该谨慎考虑对象中是否包含敏感信息,如果有,应该采取相应的安全措施

  • 性能影响: 序列化和反序列化过程可能会对性能产生一定的影响,特别是当对象结构较为复杂时。在性能敏感的场景中,要谨慎使用序列化

  • 选择合适的序列化方式: Java 提供了多种序列化方式,如默认的 Java 序列化、JSON 序列化、XML 序列化等。根据实际需求选择合适的方式

总结

序列化是一种强大的工具,为开发者提供了方便的手段来实现对象的持久化、网络通信和消息传递。通过实现 Serializable 接口,我们可以轻松地将对象序列化和反序列化。在实际应用中,要注意版本兼容性、敏感信息的处理以及选择合适的序列化方式,以确保序列化的安全和高效。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关于DNS服务器地址总是127.0.0.1且无法解析域名地址

问题 笔者尝试nslookup解释域名时,出现服务器变成本地环回口地址,导致无法解析域名 C:\Users\Zsy>nslookup www.baidu.com 服务器: UnKnown Address: 127.0.0.1*** UnKnown 找不到 www.baidu.com: Server failed排查思路 尝试关闭虚拟网卡&#…

SQL语句的执行顺序怎么理解?

SQL语句的执行顺序怎么理解? 我们常常会被SQL其书写顺序和执行顺序之间的差异所迷惑。理解这两者的区别,对于编写高效、可靠的SQL代码至关重要。今天,让我们用一些生动的例子和场景来深入探讨SQL的执行顺序。 一、书写顺序 VS 执行顺序 SQ…

JS生成用户登录图形验证码

生成用户登录图形验证码的过程可以通过几个步骤来实现&#xff0c;包括创建画布&#xff0c;生成随机验证码文本&#xff0c;将验证码文本绘制到画布上&#xff0c;以及添加一些噪点和线条来增加复杂性。 HTML 首先&#xff0c;在HTML文件中创建一个<canvas>元素和一个…

c#生成二维码二维码中间添加定制LoGo

&#x1f680;介绍 &#x1f340;QRCoder是一个开源的.NET库&#xff0c;用于生成QR码&#xff08;Quick Response Code&#xff09;。这个库是用C#编写的&#xff0c;并且可以在.NET框架的各种版本上使用&#xff0c;包括.NET Framework, .NET Core, Mono, Xamarin等。QRCode…

深入解析Linux内核网络-拥塞控制系列(二)

上篇文章&#xff1a;深入解析Linux内核网络-拥塞控制系列(一&#xff09;对Linux内核网络中网络拥塞框架的框架进行了分析。本次针对具体的Cubic拥塞控制算法进行简单分析。在进行代码的梳理前&#xff0c;同样还是先来看一下相关概念、原理&#xff1a; 在上一篇文章中也提到…

电脑出现这些现象,说明你的固态硬盘要坏了

与传统机械硬盘&#xff08;HDD&#xff09;相比&#xff0c;固态硬盘&#xff08;SSD&#xff09;速度更快、更稳定、功耗更低。但固态硬盘并不是完美无瑕的&#xff0c;由于颗粒写入机制&#xff0c;可能会在七到十年的预期寿命之前出现故障。所以用户最好为最终故障做好准备…

vue3 自己写一个月的日历

效果图 代码 <template><div class"monthPage"><div class"calendar" v-loading"loading"><!-- 星期 --><div class"weekBox"><div v-for"(item, index) in dayArr" :key"index&q…

认识计算机的设备管理

在计算机系统中&#xff0c;除了处理器和内存之外&#xff0c;其他的大部分硬设备称为外部设备。它包括输入/输出设备&#xff0c;辅存设备及终端设备等。这些设备种类繁多&#xff0c;特性各异&#xff0c;操作方式的差异很大&#xff0c;从而使操作系统的设备管理变得十分繁杂…

数据仓库工具Hive

1. 请解释Hive是什么&#xff0c;它的主要用途是什么&#xff1f; Hive是一个基于Hadoop的数据仓库工具&#xff0c;主要用于处理和分析大规模结构化数据。它可以将结构化的数据文件映射为一张数据库表&#xff0c;并提供类似SQL的查询功能&#xff0c;将SQL语句转换为MapRedu…

使用 iperf 和 iftop 测试网络带宽

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…

京东商品详情数据在数据分析行业中的重要性

京东商品详情数据在数据分析行业中具有重要作用。这些数据提供了丰富的信息&#xff0c;可以帮助企业了解市场趋势、消费者需求、产品表现以及运营策略等多个方面。 首先&#xff0c;京东商品详情数据可以为企业提供市场趋势分析的依据。通过观察商品的销售量、销售额、价格等…

Qt 6.5 类库实例大全:QObject

大家好&#xff0c;我是20YC小二&#xff01;福利时间&#xff1a;欢迎(wx)扫码关注&#xff0c;免费领取《C程序员入门必修第一课&#xff1a;C基础课程》在线视频教程&#xff0c;还有更多技术分享&#xff01;#下面进入今天内容# 1. QObject 介绍 QObject 是 Qt 库中最重要…

RocketMq集成SpringBoot(待完善)

环境 jdk1.8, springboot2.7.3 Maven依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.3</version><relativePath/> <!-- lookup parent from…

C++学习笔记:继承

继承 什么是继承?继承的写法基类和派生类的赋值转换继承中的作用域派生类的默认成员函数单继承,多继承,虚拟继承is-a 和 has-a 什么是继承? 继承是C语言面向对象的三大特性之一&#xff0c;是面向对象程序设计使代码可以复用的最重要的手段,基本都是在一个类的基础上为了增加…

一个简单的可视化的A星自动寻路

一个简单的应用场景&#xff0c;流程图连线 源码&#xff1a; addExample("A星路径查找", function () {return {template: <div><div ref"main"></div></div>,data() { return {}; },computed: {},methods: {},mounted() {var c…

2-3、运算符

语雀原文链接 文章目录 1、算术运算符2、关系运算符3、逻辑运算符4、赋值运算符5、移位运算符6、位运算符(二进制位进行运算)7、条件运算符:三目运算符8、运算符的优先级 1、算术运算符 &#xff1a;加法-&#xff1a;减法*&#xff1a;乘法/&#xff1a;除法取商%&#xff1…

logback日志框架使用

依赖引入 <dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.1.7</version> </dependency> 使用logback日志框架只需要引入以上即可&#xff0c;(我们平时使用较多的Slf4j…

Fall in love with English

Fall in love with English 爱上英语 Hiding behind the loose dusty curtain, a teenager packed up his overcoat into the suitcase. 躲藏在布满尘土的松软的窗帘后边&#xff0c;一个年轻人打包他的外套到行李箱中。 He planned to leave home at dusk though there was th…

ssh免密登录及scp/rsync免密传输文件的方式

在通过ssh登录其它电脑或通过scp/rsync同其它电脑之间传输文件时&#xff0c;每次都需要输入密码&#xff0c;如下图所示&#xff1a;在windows10上通过ssh登录虚拟机&#xff0c;每次登录都需要输入密码&#xff1b;若端口默认为22,可省略通过-p指定 可通过将本机上的公钥key存…

熔池处理Tecplot 360 和CFD-Post做出一样的效果

熔池处理Tecplot 360 和CFD-Post做出一样的效果 效果展示详细讲述Tecplot 360实现过程分析实现过程第一步实现过程第二步界面美化注意点效果展示 详细讲述Tecplot 360实现过程 分析 这里主要是将体积分数大于0.5的区域抽取出来,然后显示温度场,所以这里主要考虑下面连个思考…