Java零基础-反序列化和序列化

哈喽,各位小伙伴们,你们好呀,我是喵手。

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

Java是一门面向对象的编程语言,因此对于数据的处理也需要以对象的形式进行。在实际的开发中,我们经常需要将Java对象转化为二进制流进行传输或存储。而序列化就是将Java对象转化为二进制流的过程,反序列化则是将二进制流转化为Java对象的过程。序列化和反序列化是Java编程中非常重要的概念,本文将深入介绍Java中的序列化和反序列化机制。

摘要

本文将从以下几个方面对Java中的序列化和反序列化进行介绍:

  1. 什么是序列化和反序列化?
  2. Java中的序列化机制
  3. Java中的反序列化机制
  4. 序列化和反序列化的应用场景案例
  5. 序列化和反序列化的优缺点分析
  6. 类代码方法介绍
  7. 测试用例
  8. 全文小结和总结

简介

序列化将Java对象转化为二进制流的过程,反序列化则是将二进制流转化为Java对象的过程。Java中的序列化机制是通过实现java.io.Serializable接口实现的。这个接口中没有任何方法,只是作为一个标记,表示实现该接口的类可以被序列化。

Java中的反序列化机制是通过ObjectInputStream类实现的。这个类可以从输入流中读取数据,并将其转化为Java对象。

源代码解析

以下是一个简单的Java序列化和反序列化的示例代码:

import java.io.*;public class SerializationDemo {public static void main(String[] args) {try {// 创建一个Person对象Person person = new Person("Tom", 20);// 序列化对象到文件中FileOutputStream fileOut = new FileOutputStream("person.ser");ObjectOutputStream out = new ObjectOutputStream(fileOut);out.writeObject(person);out.close();fileOut.close();System.out.println("Serialized data is saved in person.ser");// 反序列化对象FileInputStream fileIn = new FileInputStream("person.ser");ObjectInputStream in = new ObjectInputStream(fileIn);Person person2 = (Person) in.readObject();in.close();fileIn.close();// 输出反序列化后的Person对象System.out.println("Deserialized Person:");System.out.println("Name: " + person2.getName());System.out.println("Age: " + person2.getAge());} catch (IOException i) {i.printStackTrace();} catch (ClassNotFoundException c) {System.out.println("Person class not found");c.printStackTrace();}}
}class Person implements java.io.Serializable {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public int getAge() {return age;}
}

这个例子序列化了一个Person对象,并将其保存到person.ser文件中。然后,从这个文件中读取数据,并将其反序列化为一个新的Person对象。

应用场景案例

  1. 网络传输对象:在分布式系统中,我们需要将Java对象序列化成二进制流,在网络中传输,接收方再将其反序列化为Java对象进行处理。
  2. 对象持久化到磁盘:有些时候我们需要将Java对象持久化到磁盘上,以便下次使用时能够直接加载对象,而不是重新创建对象。

优缺点分析

序列化和反序列化机制具有以下优缺点:

优点:

  1. 序列化和反序列化实现方便。
  2. 方便网络传输和持久化。
  3. 对象的序列化可以保护对象的数据,使其难以被篡改。

缺点:

  1. 序列化和反序列化需要占用较多的CPU和内存资源。
  2. 对于一些敏感的数据,序列化可能会使数据难以保密。

类代码方法介绍

  1. ObjectOutputStream类:实现对象序列化的类。
  2. ObjectInputStream类:实现对象反序列化的类。
  3. Serializable接口:一个标记接口,表示实现该接口的类可以被序列化。

测试用例

以下是一个简单的测试用例:

import java.io.*;public class SerializationDemoTest {public static void main(String[] args) {try {Person person = new Person("Tom", 20);ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);objectOutputStream.writeObject(person);objectOutputStream.flush();byte[] bytes = byteArrayOutputStream.toByteArray();ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);Person person2 = (Person) objectInputStream.readObject();System.out.println("Name: " + person2.getName());System.out.println("Age: " + person2.getAge());} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}}
}class Person implements java.io.Serializable {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public int getAge() {return age;}
}

全文小结

本文对Java中的序列化和反序列化机制进行了详细介绍。通过实现java.io.Serializable接口,我们可以将Java对象序列化为二进制流,以便在网络中传输或持久化到磁盘上。通过ObjectInputStream类,我们可以将二进制流反序列化为Java对象,以便进一步使用或处理。

在实际开发中,序列化和反序列化机制具有非常广泛的应用场景。掌握这个机制,可以使我们更加灵活地处理Java对象,提高开发效率和安全性。

总结

本文介绍了Java中的序列化和反序列化机制,详细阐述了其实现原理、应用场景和优缺点。同时,给出了一个简单的示例,以便读者更好地理解和掌握这个机制。对于Java编程初学者和想要深入了解Java的人,本文提供了非常有价值的参考资料。

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。

⭐️若有疑问,就请评论留言告诉我叭。

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

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

相关文章

回归预测 | Matlab实现CPO-BiTCN-BiGRU冠豪猪算法优化双向时间卷积门控循环单元多变量回归预测

回归预测 | Matlab实现CPO-BiTCN-BiGRU冠豪猪算法优化双向时间卷积门控循环单元多变量回归预测 目录 回归预测 | Matlab实现CPO-BiTCN-BiGRU冠豪猪算法优化双向时间卷积门控循环单元多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现CPO-BiTCN-B…

mc生存插火把

题目描述 话说有一天 linyorson 在“我的世界”开了一个 nn 的方阵,现在他有 m 个火把和 k 个萤石,分别放在 (x1,y1)∼(xm,ym) 和 (o1,p1)∼(ok,pk)的位置,没有光并且没放东西的地方会生成怪物。请问在这个方阵中有几个点会生成怪物&#xf…

Vue开发实例(六)实现左侧菜单导航

左侧菜单导航 一、一级菜单二、二级菜单三、三级菜单1、加入相关事件 四、菜单点击跳转1. 创建新页面2. 配置路由3. 菜单中加入路由配置4、处理默认的Main窗口为空的情况 五、动态左侧菜单导航1、动态实现一级菜单2、动态实现二级菜单 一、一级菜单 在之前的Aside.vue中去实现…

SRIO--IP讲解及环回测试

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、IP例化文件二、SRIO环回工程搭建三、板级验证3.1 板级验证环节3.2 系统所需硬件3.3 ILA波形前言 本章将为大家介绍 “Serial RapidIO Gen2 ”IP 的使用以及配置方法。“Serial RapidIO Ge…

JavaScript入门学(Web APIs)

1.变量声明 2 DOM介绍 2.1 什么是DOM 2.2 DOM树 2.3 DOM对象&#xff08;重要&#xff09; 3.DOM&#xff08;文档对象模型&#xff09;-获取元素 3.1 获取匹配的第一个元素 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8&…

Canvs的js库:Fabric.js简单强大,用于绘制各种图形

Fabric.js是一个用于创建交互式的HTML5 Canvas应用程序的JavaScript库。它提供了一个简单而强大的API&#xff0c;用于在Web浏览器中绘制和操作图形对象。Fabric.js可以用于创建各种图形应用程序&#xff0c;例如绘图编辑器、图像编辑器、流程图、地图和数据可视化等。 官网文…

校企合作项目总结

校企合作总结 前言项目框架开发待办水平越权总结 前言 寒假里小组给了校企合作的项目&#xff0c;分配给我的工作量总共也就两三套crud&#xff0c;虽然工作很少&#xff0c;但还是从里面学到了很多东西&#xff0c;收获了大量的实习经验&#xff0c;在这里总结记录一下。 项…

FreeRTOS学习笔记——FreeRTOS中断管理

精华总结&#xff1a; 中断优先级0为最高&#xff0c;任务优先级0为最低 中断优先级分组中为方便rtos管理4bit全部设置成抢占优先级 32单片机的中断管理是由3个寄存器完成&#xff08;名字忽略&#xff0c;具体功能忽略&#xff09;&#xff0c;三个寄存器都是32bit&#xff0c…

微信小程序云开发教程——墨刀原型工具入门(文件设置+编辑组件)

引言 作为一个小白&#xff0c;小北要怎么在短时间内快速学会微信小程序原型设计&#xff1f; “时间紧&#xff0c;任务重”&#xff0c;这意味着学习时必须把握微信小程序原型设计中的重点、难点&#xff0c;而非面面俱到。 要在短时间内理解、掌握一个工具的使用&#xf…

NOC2023软件创意编程(学而思赛道)python小高组决赛真题

目录 下载原文档打印做题: 软件创意编程 一、参赛范围 1.参赛组别:小学低年级组(1-3 年级)、小学高年级组(4-6 年级)、初中组。 2.参赛人数:1 人。 3.指导教师:1 人(可空缺)。 4.每人限参加 1 个赛项。 组别确定:以地方教育行政主管部门(教委、教育厅、教育局) 认…

【风格迁移】StyTr2:引入 Transformer 解决 CNN 在长距离依赖性处理不足和细节丢失问题

StyTr2&#xff1a;引入 Transformer 解决 CNN 在长距离依赖性处理不足和细节丢失问题 提出背景StyTr2 组成StyTr2 架构 提出背景 论文&#xff1a;https://arxiv.org/pdf/2105.14576.pdf 代码&#xff1a;https://github.com/diyiiyiii/StyTR-2 问题&#xff1a; 传统的神经…

idea中springboot项目创建后追加依赖

springboot项目创建后追加依赖 前言1、安装插件editstarters设置->插件 2、进入pom.xml 页面 前言 在项目创建的时候选择好依赖创建项目&#xff0c;之后追加依赖不是很方便&#xff0c;介绍一个简单的使用方法&#xff0c;通过editstarters进行添加 1、安装插件editstart…

在 Ubuntu 终端输出不同颜色、粗体、下划线或其他样式的字体

嗯。调试时总发现自己打印的调试信息太过普通、单调&#xff0c;于是乎…… Notice 要在终端实现字体的特殊样式&#xff0c;通常通过使用特殊的控制字符来实现&#xff0c;而不是通过某语言本身的功能来实现。 在大多数终端中&#xff0c;可以使用 ANSI 转义序列来设置字体的…

CleanMyMac X2024测评深度分析与功能全面介绍

一、软件概述 CleanMyMac X 是一款强大的Mac清理和优化工具&#xff0c;它可以帮助用户轻松管理和释放Mac上的空间&#xff0c;优化系统性能&#xff0c;提高运行速度。这款软件以其直观的用户界面和丰富的功能受到了广大Mac用户的欢迎。 CleanMyMac X4.14.6全新版下载如下: …

令牌桶算法和漏桶算法各自的应用场景

令牌桶算法和漏桶算法都是流量控制算法&#xff0c;它们在网络和系统中有着不同的应用场景&#xff0c;具体如下&#xff1a; 令牌桶算法的应用场景&#xff1a; 网络流量控制&#xff1a; 令牌桶算法广泛应用于网络流量控制中&#xff0c;特别是在网络设备中&#xff0c;如路…

html基础标签+Http请求

文章目录 目录 文章目录 前言 一.网址组成 二.HTTP协议解析 Http 请求报文 报文请求方法 报文头 Cache-Control 常见缓存控制行为 cookie 解析 Http 响应报文 常见状态码 三.域名解析(DNS) DNS域名服务器分类 递归查询 迭代查询 四.端口号 五.路径信息 六.Https协议 ​对称…

第一篇【传奇开心果系列】Python的自动化办公库技术点案例示例:深度解读Pandas库

传奇开心果博文系列 系列博文目录Python的自动化办公库技术点案例示例系列 博文目录前言一、主要特点和功能介绍二、Series 示例代码三、DataFrame示例代码四、数据导入/导出示例代码五、数据清洗示例代码六、数据选择和过滤示例代码七、数据合并和连接示例代码八、数据分组和聚…

Linux系统管理:虚拟机 Kali Linux 安装

目录 一、理论 1.Kali Linux 二、实验 1.虚拟机Kali Linux安装准备阶段 2.安装Kali Linux 2. Kali Linux 更换国内源 3. Kali Linux 设置固定IP 4. Kali Linux 开启SSH远程连接 5. MobaXterm远程连接 Kali Linux 三、问题 1.apt 命令 取代哪些 apt-get命令 一、理论…

《OpenScene: 3D Scene Understanding with Open Vocabularies》阅读笔记1

传统的3D场景理解方法依赖于带标签的3D数据集,用于训练一个模型以进行单一任务的监督学习。我们提出了OpenScene,一种替代方法,其中模型在CLIP特征空间中预测与文本和图像像素共同嵌入的3D场景点的密集特征。这种零样本方法实现了与任务无关的训练和开放词汇查询。例如,为了…

Phoncent博客:探索AI写作与编程的无限可能

Phoncent博客&#xff0c;一个名为Phoncent的创新AIGC博客网站&#xff0c;于2023年诞生。它的创始人是庄泽峰&#xff0c;一个自媒体人和个人站长&#xff0c;他在网络营销推广领域有着丰富的经验。庄泽峰深知人工智能技术在内容创作和编程领域的潜力和创造力&#xff0c;因此…