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

序列化定义以及使用和注意事项

什么是序列化和反序列化

序列化:是将对象转换为可传输或存储的过程,

反序列化:通常是将字节流或是其他数据格式或源数据转为对象的过程。

序列化的作用
  1. 对象的持久化:将对象的状态保存到磁盘或数据库中,以便在程序重新启动时恢复对象。
  2. 对象的传输:通过网络或其他通信方式将对象发送到远程系统,实现分布式系统的通信。
  3. 对象的缓存:将对象序列化后存储在缓存中,可以提高读取和响应速度。

总结来说序列化后可以传输,持久化保存到文件或系统缓存中进行交互。

java序列化转成字节流的好处

跨平台兼容以及方便传输和持久化存储: 字节流是一种通用的数据表示方式,可以在不同平台客户端,服务器之间传输或磁盘上或在数据库中存储

占用空间小和隐私安全: 字节流更紧凑,并且不直接暴露对象的内部结构和属性,占用更少的存储空间。

总结将对象序列化为字节流跨平台兼容以及方便传输,紧凑占用空间小和隐私更安全。

java中序列化的实现
类实现 Serializable 接口,

Serializable 接口没有任何方法,只是一个标记接口是一个约定和规范,是为了表明一个类可以被序列化会把对象转换为字节流,具体序列化过程就是通过流将对象写入流 在读出来

import java.io.Serializable;public class MyClass implements Serializable {// 类的成员变量和方法
}
类实现 Externalizable 接口

需要实现 writeExternal 和 readExternal 方法,以提供更高度的自定义序列化和反序列化过程

import java.io.Externalizable;
import java.io.ObjectInput;
import java.io.ObjectOutput;public class MyExternalizableClass implements Externalizable {@Overridepublic void writeExternal(ObjectOutput out) {// 自定义序列化逻辑}@Overridepublic void readExternal(ObjectInput in) {// 自定义反序列化逻辑}
}
将对象转为JSON格式或是解析JSON数据转为对象
// 通过jdk的ObjectMapper将对象转为json
AllPerson person = new AllPerson();
ObjectMapper objectMapper = new ObjectMapper();
String jsonString = objectMapper.writeValueAsString(person);// 还可以通过alibaba的fastjson或是hutoll的json工具
关于序列化注意的问题
定义serialVersionUID有什么用

serialVersionUID是一个用于版本控制的静态变量,用于确保在对象序列化和反序列化过程中,类的版本一致性

transient修饰成员变量不被序列化

如果在一个序列化的类中一些成员变量不需要或不能被序列化可以使用关键字transient修饰

NotSerializableException

如果一个类没有实现Serializable接口 但是在用流将类序列化时就会报错

关于JSON序列化的理解

将对象解析成JSon格式就是序列化的过程,将JSON数据解析为对象就是反序列化的过程,因为JSON也是一种通用的跨平台的格式

演示了如何将一个实现了 Serializable 接口的对象序列化成字节流,并在反序列化时还原对象
import java.io.*;public class SerializationExample {public static void main(String[] args) {// 创建一个实现了 Serializable 接口的对象MyClass myObject = new MyClass("Hello, Serialization!");// 将对象序列化为字节流try (FileOutputStream fileOut = new FileOutputStream("myobject.ser");ObjectOutputStream out = new ObjectOutputStream(fileOut)) {out.writeObject(myObject);} catch (IOException e) {e.printStackTrace();}// 从字节流中反序列化对象try (FileInputStream fileIn = new FileInputStream("myobject.ser");ObjectInputStream in = new ObjectInputStream(fileIn)) {MyClass restoredObject = (MyClass) in.readObject();System.out.println(restoredObject.getMessage()); // 输出: Hello, Serialization!} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}}
}class MyClass implements Serializable {private String message;public MyClass(String message) {this.message = message;}public String getMessage() {return message;}
}

相关文章:

序列化定义以及使用和注意事项

什么是序列化和反序列化 序列化:是将对象转换为可传输或存储的过程, 反序列化:通常是将字节流或是其他数据格式或源数据转为对象的过程。 序列化的作用 对象的持久化:将对象的状态保存到磁盘或数据库中,以便在程序…...

吴恩达机器学习COURSE1 WEEK3

COURSE1 WEEK3 逻辑回归 逻辑回归主要用于分类任务 只有两种输出结果的分类任务叫做二元分类,例如预测垃圾邮件,只能回答是或否 实际上,在逻辑回归中,我们要做的任务就类似于在数据集中画出一个这样的曲线,用来作为…...

白骑士的PyCharm教学高级篇 3.1 性能分析与优化

系列目录 上一篇:白骑士的PyCharm教学进阶篇 2.5 数据库连接与管理 在软件开发中,性能分析与优化是提高程序运行效率和用户体验的重要环节。PyCharm提供了强大的性能分析工具,帮助你识别和优化代码中的性能瓶颈。本文将详细介绍PyCharm中的代…...

swiper横向轮播(阶梯式滚动轮播)未生效

问题描述 版本问题 使用swiper4以上的版本可以解决该问题,4以上的swiper采用了this指向。...

基于arcpro3.0.2的北斗网格生成简介

基于arcpro3.0.2的北斗网格生成简介 采用2000坐标系、可基于行政区范围 软件可生成第一级到第十级北斗网格经纬跨度 等分 约赤道处距离 第一级 6X4度 60 和A~V 660 km 第二级 30X30分 12X8 …...

网络流算法:最大流问题

引言 最大流问题是网络流中的一个经典问题,其目标是在给定的流网络中找到从源点到汇点的最大流量。最大流问题在交通运输、计算机网络、供应链管理等领域有广泛的应用。本文将详细介绍最大流问题的定义、解决方法以及具体算法实现。 目录 最大流问题的定义Ford-F…...

C++从入门到入土(四)--日期类的实现

目录 前言 日期类的实现 日期的获取 日期的比较 const成员函数 日期的加减 日期的加等 日期的减等 日期的加减 日期的加加减减 日期的相减 流插入和提取的重载 友元 友元的特点 日期类代码 总结 前言 前面我们介绍了C中类和对象的相关知识和六个默认成员函数&…...

【香橙派系列教程】(七)香橙派下的Python3安装

【七】香橙派下的Python3安装 为接下来的Linux图像识别智能垃圾桶做准备。 图像处理使用京东SDK只支持pyhton和Java接口,目的是引入C语言的Python调用,感受大厂做的算法bug 此接口是人工智能接口,京东识别模型是通过训练后的模型,…...

贝叶斯优化算法(Bo)与门控循环单元(GRU)结合的预测模型(Bo-GRU)及其Python和MATLAB实现

### 背景 随着时间序列数据在各个领域(如金融、气象、医疗等)应用的日益广泛,如何准确地预测未来的数据点成为了一个重要的研究方向。长短期记忆网络(LSTM)和门控循环单元(GRU)作为深度学习模型…...

人工智能时代,程序员当如何保持核心竞争力?

目录 前言 一.AI辅助编程对程序员工作的影响 二.程序员应重点发展的核心能力 三.人机协作模式下的职业发展规划 结束语 前言 随着AIGC(如chatgpt、midjourney、claude等)大语言模型接二连三的涌现,AI辅助编程工具日益普及,程序…...

LMDrive 端到端闭环自动驾驶框架

LMDrive,一种新颖的语言引导的端到端闭环自动驾驶框架。LMDrive独特地处理和整合多模态传感器数据与自然语言指令,使车辆能够在现实的指令设置中与人类和导航软件进行交互。 LMDrive由两个主要部分组成: 1)一个视觉编码器&#x…...

P2045 方格取数加强版

Description 给定一个 n n n \times n nn 的矩阵,从左上角出发,可以往右或者往下走,每到达一个方格,就取走上面的数(取过后格子上的数会清零),一共要走 k k k 次,求取到的数之和…...

【Bigdata】OLAP的衡量标准

这是我父亲 日记里的文字 这是他的生命 留下留下来的散文诗 几十年后 我看着泪流不止 可我的父亲已经 老得像一个影子 🎵 许飞《父亲写的散文诗》 OLAP(联机分析处理)系统的衡量标准主要集中在以下几个方面:…...

关于DDOS攻击趋势及防护措施

随着互联网技术的飞速发展,网络安全问题日益成为企业不可忽视的重要议题。分布式拒绝服务(DDoS)攻击作为其中的典型代表,以其强大的破坏力和难以防范的特性,给企业的网络安全带来了巨大挑战。今天我们就来了解下当前DD…...

Apache Flink:一个开源流处理框架

文章目录 引言官网链接Flink 原理概述核心概念 基础使用环境搭建编写 Flink 程序注意事项 高级使用窗口操作状态后端复杂事件处理(CEP)与 Kafka 集成 优点结论 引言 Apache Flink 是一个开源流处理框架,专为高吞吐量、低延迟的实时数据处理设…...

Nginx 学习笔记

1. Nginx简介 Nginx 是一个高性能的Http和反向代理服务器。也是一个IMAP/POP3/SMTP等邮件代理服务器。 特点: 占有内存少并发能力强安装非常的简单配置文件非常简洁(还能够支持perl语法)Bug非常少启动特别容易,并且几乎可以做到…...

软甲测试定义和分类

软件测试定义 使用人工和自动手段来运行或测试某个系统的过程,其目的在于检验他是否满足规定的需求或弄清预期结果与实际结果之间的差别 软件测试目的 为了发现程序存在的代码或业务逻辑错误 – 第一优先级发现错误为了检验产品是否符合用户需求 – 跟用户要求实…...

Vue 3+Vite+Eectron从入门到实战系列之(二)一Elementplus及VueRouter的配置

为了后续开发方便,在没有 UI 设计师配合的情况下,让我们的界面更加美观,我们使用 elementplus 组件库,并配置路由。 删除不需要的默认文件夹及文件,src 配置如下 实现效果 安装 elementplus,vue-router npm install element-plus --save npm install vue-router --save在…...

STL-list

1.list 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。 2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。 3. l…...

2024 7.29~8.4 周报

一、上周工作 2024 7.22~7.28周报-CSDN博客 二、本周计划 修改论文 三、完成情况 3.1 论文修改 3.1.1 摘要 问题:所写问题是一般性的深度网络问题(过拟合),并没有针对FWI的问题(边缘不清晰、深层不清晰、速度慢…...

随身助手271个可用api接口网站php源码(随身助手API)

源码简介: 随身助手API,本次更新了271个可用接口,现在开源给大家使用,无后门无加密,放心使用。 {“标题”:”看图猜成语接口”,”小标题”:”随身助手API”,”地址”:”tianyi/LookIdiom.php”,”状态”:”正常”} {…...

珠江电缆,顺应全球变化,实现高质量出海

在全球经济快速变化的今天,越来越多的企业将目光投向了国际市场。特别是对于线缆行业来说,顺应全球变化、应对机遇与挑战,实现高质量出海已成为长期发展的战略目标之一。珠江电缆作为一家集研发、制造和销售为一体的大型专业电线电缆企业&…...

redis面试(四)持久化

什么是持久化? 由于redis是基于内存操作的轻量型数据库,所以如果发生宕机重启这种事情,存储的数据就会直接丢失,如果在里面存储了没有备份的数据,那么确实会对我们的业务造成一定影响。 所以我们要通过持久化的手段&a…...

构建数据桥梁:Pandas如何简化API到DataFrame的转换

在数据科学的广阔天地中,API如同一把钥匙,为我们打开了通往丰富数据资源的大门。无论是追踪最新的股市动态,还是分析社交媒体趋势,API都能提供我们需要的实时数据。今天,我们将一起探索如何利用Python的pandas库&#…...

echarts制作grafana 面板之折线图

最近有需求需要制作grafana 来实现自己的需求,于是开始研究 实现效果如下 实现代码 import * as echarts from echarts;var chartDom document.getElementById(main); var myChart echarts.init(chartDom, dark); var option;function getLast30Days() {let da…...

技术男的审美反击:UI配置化新纪元

之前常常被甲方的领导说,我们全是一群钢铁直男,一点不懂审美,其实我们心里边想的 “您说得对啊!!!!” 这个可能和理工科有关系吧,理工男好像都差不多,所以这次我们就把很…...

73.结构体指针参数传递

目录 一.结构体指针参数传递 二.视频教程 一.结构体指针参数传递 结构体指针也可以作为参数传递&#xff0c;相对于结构体变量参数传递&#xff0c;结构体指针变量作为函数参数传递速度更快&#xff0c;效率更高。 举例&#xff1a; #include <stdio.h> #include <…...

面向对象编程与Scala:掌握核心概念与应用

面向对象编程与Scala&#xff1a;掌握核心概念与应用 1. 引言 Scala 是一种融合了面向对象编程&#xff08;OOP&#xff09;和函数式编程&#xff08;FP&#xff09;特性的编程语言。它为开发者提供了强大的工具来创建高效且灵活的软件。面向对象编程是一种编程范式&#xff…...

《Advanced RAG》-07-探索 RAG 中表格数据的处理方案

摘要 本文详细讨论了实现 Retrieval-Augmented Generation&#xff08;RAG&#xff09;时对表格进行处理的挑战&#xff0c;特别是在非结构化文档中自动准确地提取和理解表格信息。 首先介绍了RAG中管理表格的关键技术&#xff0c;包括表格解析和索引结构设计。 接着&#xff0…...

Dubbo源码深度解析(二)

接着《Dubbo源码深度解析(一)》继续讲&#xff0c;上篇博客主要讲Dubbo提供的三个注解的作用&#xff0c;即&#xff1a;EnableDubbo、DubboComponentScan、EnableDubboConfig。其中后两个注解是在EnableDubbo上的&#xff0c;因此在启动类上加上EnableDubbo注解&#xff0c;等…...