序列化和反序列化详解

序列化和反序列化是计算机科学中非常重要的概念,尤其在处理分布式系统、网络通信、数据存储等场景时。下面将详细解释这两个过程,并使用Java语言作为示例。

序列化 (Serialization)

定义:序列化是将数据结构或对象状态转换为可以存储或传输的格式的过程。在序列化期间,对象将其当前状态写入到临时或永久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

目的

  1. 持久性:将对象的状态保存在存储媒体中,以便可以在以后重新创建对象。
  2. 数据交换:通过网络发送对象到另一个运行着不同操作系统或平台上的进程。
  3. 远程方法调用(RMI):在分布式系统中,允许对象在远程服务器上执行方法,就像它们是本地对象一样。

Java序列化示例

假设我们有一个简单的Person类,我们想将其序列化:

import java.io.Serializable;public class Person implements Serializable {private String name;private int age;// 构造器、getter和setter方法...// serialVersionUID用于验证序列化对象的版本兼容性private static final long serialVersionUID = 1L;
}

要序列化一个Person对象,我们可以使用ObjectOutputStream

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;public class SerializeExample {public static void main(String[] args) {Person person = new Person();person.setName("Alice");person.setAge(30);try {FileOutputStream fileOut = new FileOutputStream("./person.ser");ObjectOutputStream out = new ObjectOutputStream(fileOut);out.writeObject(person); // 将person对象写入到文件中out.close();fileOut.close();System.out.printf("Serialized data is saved in ./person.ser");} catch (IOException i) {i.printStackTrace();}}
}

反序列化 (Deserialization)

定义:反序列化是序列化的逆过程。它从字节流中读取数据,并将其转换回原始的对象形式或数据结构。

目的:重新获得保存在持久化存储或通过网络传输的对象的状态,以便在程序中再次使用这些对象。

Java反序列化示例

要从文件中反序列化Person对象,我们可以使用ObjectInputStream

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;public class DeserializeExample {public static void main(String[] args) {Person person = null;try {FileInputStream fileIn = new FileInputStream("./person.ser");ObjectInputStream in = new ObjectInputStream(fileIn);person = (Person) in.readObject(); // 从文件中读取并转换为Person对象in.close();fileIn.close();} catch (IOException i) {i.printStackTrace();return;} catch (ClassNotFoundException c) {System.out.println("Person class not found");c.printStackTrace();return;}System.out.println("Deserialized Person...");System.out.println("Name: " + person.getName());System.out.println("Age: " + person.getAge());}
}

在这两个例子中,我们首先创建了一个Person对象,并将其序列化到文件中。然后我们从文件中读取数据并将其反序列化为Person对象。注意,为了使一个类的对象可序列化,它必须实现java.io.Serializable接口。此外,为了版本控制的目的,我们经常在可序列化的类中添加一个名为serialVersionUID的静态最终字段。如果接收方加载的类的serialVersionUID与相应的发送方的类不匹配,则会抛出InvalidClassException

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

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

相关文章

Java基础综合练习(飞机票,打印素数,验证码,复制数组,评委打分,数字加密,数字解密,抽奖,双色球)

练习一:飞机票 需求: ​ 机票价格按照淡季旺季、头等舱和经济舱收费、输入机票原价、月份和头等舱或经济舱。 ​ 按照如下规则计算机票价格:旺季(5-10月)头等舱9折,经济舱8.5折,淡季(11月到来…

cloudcompare 编译安装解决无法load pcd文件问题

参考 https://github.com/CloudCompare/CloudCompare/blob/master/BUILD.md sudo apt install libqt5svg5-dev libqt5opengl5-dev qt5-default qttools5-dev qttools5-dev-tools libqt5websockets5-dev git clone --recursive https://github.com/cloudcompare/CloudCompare.g…

Flink学习-处理函数

简介 处理函数是Flink底层的函数,工作中通常用来做一些更复杂的业务处理,处理函数分好几种,主要包括基本处理函数,keyed处理函数,window处理函数。 Flink提供了8种不同处理函数: ProcessFunction&#x…

【algorithm】自动驾驶常见常考的几个模型和推导,顺便总结自己遇到的考题经验不断更新之———控制版

写在前面 本来快达成目标了,没想到公司遭受了问题,公司和同事我感觉还是挺好的,有国企的正规也有小企业的灵活,大家都很有学习欲望。 作为本次再次复习回忆如下: 把之前面试准备的 机器学习(基本搬运到CSD…

JVM篇:JVM的简介

JVM简介 JVM全称为Java Virtual Machine,翻译过来就是java虚拟机,Java程序(Java二进制字节码)的运行环境 JVM的优点: Java最大的一个优点是,一次编写,到处运行。之所以能够实现这个功能就是依…

电脑突然不能使用win+x后的快捷键的解决方法

在一次使用电脑后我习惯性的winxuh进行休眠,但是失败了,我发现winx后并没有出现曾经常用的快捷键方式。 左边图片显示的是正常情况。我遇到的情况是图片右边快捷键位没有了,并且也不能进行快捷操作。 国内的网站我都搜索过了,甚至…

outlook邮箱群发邮件方法?邮箱如何群发?

outlook邮箱群发邮件如何使用?QQ邮箱设置群发的步骤? Outlook邮箱群发邮件:必要性 Outlook邮箱作为全球广泛使用的邮件服务之一,不仅提供了便捷的邮件收发功能,还支持多种附件、日历提醒及强大的联系人管理。Outlook…

Python 实现给 pdf 文件自动识别标题并增添大纲

一、背景: 客户方提供过来一个开放平台的pdf文档,文档里有几十个接口,没有大纲和目录可以定位到具体内容,了解整体的API功能,观看体验极度差劲,所以想使用Python代码自动解析pdf文档,给文档增添…

某人寿保险公司基础架构云化与小机数仓下移实践

随着数据中心 IT 基础架构的不断演进,云计算、大数据、移动互联的需求日益高涨,快速敏捷、易于维护以及扩展性,逐渐成为金融机构在升级数据中心时重点考虑的方面。 某人寿保险公司(以下简称“客户”)过往采用传统三层架…

PS插件一键生成超治愈向日葵花海

金黄色的向日葵总能给人带来治愈的感觉,仿佛在这里能够疗愈心灵所有的伤口。今天我们通过START AI来生成一片美丽的向日葵花海~ 这是小编使用的关键词,负面词需要填写你不想要拥有的,能够让生成的结果更贴合你的想法 最后的生成效果就如下图…

我的Spring Cloud学习之旅:原因、过程和收获

简介: 在这篇文章中,我将分享我学习Spring Cloud的经验和经历。我将谈到我开始学习Spring Cloud的原因,我是如何进行学习的,以及最终的学习成果。希望通过这篇文章,读者们可以从中获得一些有用的收获和启发。 正文&…

IC工程师级别与薪资是怎样的?资深工程师一文带你了解清楚

入行IC之后,想必大家更关心的就是工程师薪资和级别,因为入行的大多数也是工程师。 国际的一流企业基本上工程师分为以下几个级别:普通工程师,资深工程师,主管工程师,资深主管,总工, 资深总工&am…

电子电器架构(E/E)演化 —— 车载以太网

电子电器架构(E/E)演化 —— 车载以太网 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 本文13000字。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一…

笔记1:基于锚框(先验框)的目标检测

一、边缘框(bounding box) 1.1 定义 边缘框:真实标注的物体位置 2.1 表示方式 1、(x1,y1)和(x2,y2) 2、(x1,y1)和w,h 二、锚框(anchor box)/先验框(prior bounding box) 2.1 定义 对边缘…

如何高效使用Excel的SUMIF函数:掌握条件求和的技巧

背景: 在日常工作中,我们经常遇到这样的情况:需要根据特定条件对一系列数据进行求和。幸运的是,Excel提供了一个强大的工具来简化这一任务——SUMIF函数。本博客将带你深入了解如何使用SUMIF函数,包括一些实用的示例和…

MySQL5.7服务器 SQL 模式

官网地址:MySQL :: MySQL 5.7 Reference Manual :: 5.1.10 Server SQL Modes 欢迎关注留言,我是收集整理小能手,工具翻译,仅供参考,笔芯笔芯. MySQL 5.7 参考手册 / ... / 服务器 SQL 模式 5.1.10 服务器 SQL 模式…

Django 学习教程- Django模板(Template)

系列 Django 学习教程-介绍与安装-CSDN博客 Django 学习教程- Hello world入门案例-CSDN博客 前言 在上一章节中我们使用django.http.HttpResponse() 来输出 "Hello World!"。该方式将数据与视图混合在一起,不符合 Django 的 MTV 思想。 本…

Linux network — 网络层收发包流程及 Netfilter 框架浅析

Linux network — 网络层收发包流程及 Netfilter 框架浅析 1. 前言2. 基础网络知识2.1 网络分层模型2.2 数据包协议分层2.3 sk_buff 结构2.4 收发包整体框架 3. 网络层(IPv4)收发包流程4. Netfilter 框架4.1 IPv4 网络层的 Netfilter Hook 点4.2 iptable…

算法——队列+宽搜(BFS)

队列这种数据结构大都服务于一个算法——宽搜(BFS)。宽搜还可以运用到二叉树、图、迷宫最短路径问题、拓扑排序等等 N叉数的层序遍历 N叉树的层序遍历 题目解析 给定一个 N 叉树,返回其节点值的_层序遍历_。(即从左到右&#…

Word2Vec原理+gensim实现

链接:https://download.csdn.net/download/qq_60567426/88692270