【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;}@Overridepublic 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;}@Overridepublic 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;}@Overridepublic 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 接口,我们可以轻松地将对象序列化和反序列化。在实际应用中,要注意版本兼容性、敏感信息的处理以及选择合适的序列化方式,以确保序列化的安全和高效。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

推荐一款好用的3D资产管理器(Connecter)

中文汉化版Connecter 3.0 软件的使用教程视频: 中文汉化版Connecter 3.0安装方法与简单的使用说明 软件下载地址:https://download.csdn.net/download/Highning0007/88615583

midwayjs从零开始创建项目,连接mikro-orm框架(必须有java的springboot基础)

前言: 我一直都是用java的springboot开发项目,然后进来新公司之后,公司的后端是用node.js,然后框架用的是 midwayjs ,然后网上的资料比较少,在此特地记录一波 文档: 1.官方文档:介绍…

前端 Web Workers 简介

简介 以前我们总说,JS 是单线程没有多线程,当 JS 在页面中运行长耗时同步任务的时候就会导致页面假死影响用户体验,从而需要设置把任务放在任务队列中;执行任务队列中的任务也并非多线程进行的,然而现在 HTML5 提供了…

【C++】C++中的String类详解及模拟实现示例

文章目录 string类简介string类的基本用法string类的常用方法string类的优势 string类的模拟实现存储结构头文件string.h源文件string.cpp源文件test.cpp string类简介 string类简介在C编程中,字符串是一种非常常见的数据类型,用于存储文本信息。C标准库…

win11 CUDA(12.3) + cuDNN(12.x) 卸载

win11 CUDA(12.3) cuDNN(12.x)卸载 信息介绍卸载 信息介绍 本文是对应 win11RTX4070Ti 安装 CUDA cuDNN(图文教程) 的卸载 卸载 控制面板 --> 程序 --> 卸载程序 卸载掉图中红框内的&#xff0c…

HTML+CSS+JavaScript制作简单轮播图

一 运行效果 二 图片资源 三 代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>img{position:absolute;top:6%;left:20%;width:800px;height:240px;}.picture {back…

airserver mac 7.27官方破解版2024最新安装激活图文教程

airserver mac 7.27官方破解版是一款好用的airplay投屏工具&#xff0c;可以轻松将ios荧幕镜像&#xff08;airplay&#xff09;至mac上&#xff0c;在mac平台上实现视频、音频、幻灯片等文件资源的接收及投放演示操作&#xff0c;解决iphone或ipad的屏幕录像问题&#xff0c;满…

DAPP开发【10】express.js的使用

Express.js 是一种流行、轻量级的开源 Web 应用程序框架&#xff0c;用于开发基于 Node.js 的服务器端 Web 应用程序。它提供了强大的功能集&#xff0c;适用于 Web 和移动应用程序。Express.js 旨在支持单页、多页和混合式 Web 应用程序的开发。Express.js 提供了广泛的功能&a…

基于SpringBoot+Vue的学校在线学习系统

开发环境 IDEA JDK1.8 MySQL8.0Node 系统简介 本系统拥有管理员&#xff0c;教师&#xff0c;学生三种身份登录&#xff0c;管理员登录可以查看所有信息&#xff0c;教师登录可以发布作业&#xff0c;查看试卷&#xff0c;回答问题等&#xff0c;学校登录可以查看作业&…

Windows Service Name重复问题

Windows Service Name重复问题 1&#xff0c;问题 2&#xff0c;打开命令提示符&#xff0c;管理员身份运行 3&#xff0c;输入命令&#xff1a;sc delete MYSQL57 4&#xff0c;验证一下&#xff0c;可以看见已经没有感叹号啦 &#xff0c;可以看见已经没有感叹号啦

二叉搜索树中第K小的元素[中等]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给定一个二叉搜索树的根节点root&#xff0c;和一个整数k&#xff0c;请你设计一个算法查找其中第k个最小元素&#xff08;从1开始计数&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,1,4,null,2], k 1 输出&#x…

linux权限管理以及shell

1.shell 1.1什么是shell? shell即外壳&#xff0c;是运行在linux系统上的一个脚本语言&#xff0c;包裹在linux内核的外面。我们常说的linux操作系统实际上是linux内核。我们使用的所有指令都是一个个程序&#xff0c;而shell指令就是一个将我们用户的操作翻译给linux内核的程…