在php中的序列化与反序列化

序列化与反序列化的定义:

        序列化是指把对象转化为可传输的字节序列过程,而反序列化是指把字节序列还原为对象的过程。序列化和反序列化是数据持久化和网络传输中常用的技术手段,它们使得数据可以在不同平台、不同系统之间进行有效的存储和通信。

序列化详解:

  1. 概念解释:序列化是将对象的状态信息转换为可以存储或传输的形式(如字节流)的过程。这个过程可以通过不同的方式实现,例如使用Java内置的Serializable接口或者通过其他第三方库如JSON、XML等。

  2. 应用场景:序列化主要用于对象的持久化存储以及网络传输。在存储方面,它可以将对象保存到数据库或文件中;在网络传输方面,它允许对象通过网络发送到远程系统上,然后再反序列化成本地对象。

  3. 实现方法:在Java中,实现序列化的一种常见方法是让对象实现Serializable接口。这个接口虽然没有方法需要实现,但它标记了这个对象可以被JVM序列化和反序列化。

  4. 注意事项:在序列化过程中,静态字段和用transient关键字修饰的字段不会被序列化。此外,为了确保版本兼容性,建议显式定义serialVersionUID来控制版本的一致性。

  5. 性能考虑:选择序列化工具和技术时,需要考虑其性能和生成的数据大小。例如,Protobuf和MessagePack等工具提供了更小的消息大小和更快的序列化速度,适合在大规模分布式系统中使用。

反序列化详解:

  1. 概念解释:反序列化是将字节序列恢复成原有对象形态的过程。这一过程本质上是序列化的逆操作,要求能够准确地还原对象的状态。

  2. 应用场景:当数据从数据库或文件系统中读取出来,或者通过网络接收到序列化的数据后,客户端需要对这些数据进行反序列化,以重建原有的对象状态,进而执行业务逻辑处理。

  3. 实现方法:在Java中,使用ObjectInputStream类可以从输入流中读取字节序列,并将其反序列化为对象。这要求原始对象类实现了Serializable接口。

  4. 安全注意:反序列化过程可能存在安全风险,因为执行反序列化的过程中可能会运行恶意代码。因此,在处理不受信任的输入流时,应当格外小心,并采取相应的安全防护措施。

  5. 兼容性问题:如果序列化对象的类结构发生了变化(如添加了新的字段),可能导致反序列化失败。因此,管理serialVersionUID并合理设计类的结构变化对于保证反序列化的成功率至关重要。

总结而言,序列化与反序列化是数据处理和系统间通信不可或缺的技术。它们支持数据的持久化存储和跨网络传输,适用于多种场合,包括数据缓存、远程方法调用等。在选择具体的序列化技术时,应综合考虑性能、跨平台支持、安全性等因素,以适应不同的应用需求。

序列化与反序列化例子:
 

注意,当我们在序列化一个类的时候我们需要将该类定义出来。如下。

<?php
$raw = 'O:1:"A":1:{s:1:"a";s:1:"b";}';
var_dump(unserialize($raw));  //1进行反序列化并输出
echo serialize(unserialize($raw)); //2先进行反序列化再进行序列化。
?>//输出结果1:
object(__PHP_Incomplete_Class)#1 (2) { ["__PHP_Incomplete_Class_Name"]=> string(1) "A" ["a"]=> string(1) "b" }//输出结果2:
O:1:"A":1:{s:1:"a";s:1:"b";}

这段代码中的$raw字符串是一个序列化后的PHP对象。它包含了一个名为"A"的类的实例,该类有一个属性"a",其值为"b"。我们

$raw解析:

  1. O:1:"A":1:{s:1:"a";s:1:"b";}表示一个对象,其中:
    • O:1:"A"表示对象的类型为"A",并且该类型的类定义在当前命名空间中(即没有指定命名空间)。
    • 1表示对象的属性数量为1个。
    • {s:1:"a";s:1:"b";}表示对象的属性列表,其中:
      • s:1:"a"表示一个字符串类型的属性,属性名为"a",长度为1。
      • s:1:"b"表示另一个字符串类型的属性,属性名为"a"的值,长度为1。
  2. 反序列化$raw字符串后,会得到一个名为"A"的类的实例,该实例有一个属性"a",其值为"b"。

|我们通过对php的代码分析发现我们序列化了一个不存在的类“A“,但是当我们对$raw进行反序列化再序列化之后的输出和原来一样,这是为什么呢?
原因如下:

        可以发现PHP在遇到不存在的类时,会把不存在的类转换成__PHP_Incomplete_Class这种特殊的类,同时将原始的类名A存放在__PHP_Incomplete_Class_Name这个属性中,其余属性存放方式不变。而我们在序列化这个对象的时候,serialize遇到__PHP_Incomplete_Class这个特殊类会倒推回来,序列化成__PHP_Incomplete_Class_Name值为类名的类,我们看到的序列化结果不是O:22:"__PHP_Incomplete_Class_Name":2:{xxx}而是O:1:"A":1:{s:1:"a";s:1:"b";}

正常情况下的代码应该这样写:

<?php
class A {public $a;
}  //将A这个类定义出来$raw = 'O:1:"A":1:{s:1:"a";s:1:"b";}';
$object = unserialize($raw);
var_dump($object);  //输出反序列化的结果
?>
//输出结果如下:
object(A)#1 (1) {["a"]=>string(1) "b"
}

这表示我们成功地定义了类 "A",并通过反序列化得到了一个该类的实例,其中属性 $a 的值被正确设置为 "b"。

注意:

在实际应用中,序列化和反序列化数据时,确保在进行反序列化之前,相关的类已经被定义,以避免遇到__PHP_Incomplete_Class或其它潜在问题。

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

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

相关文章

HTML 中怎样优化图像加载以提高网页性能?

优化图像加载可以提高网页性能&#xff0c;以下是一些常见的优化方法&#xff1a; 缩小图像尺寸&#xff1a;使用合适的图像尺寸可以减小文件大小&#xff0c;加快加载速度。可以使用图像编辑工具将图像调整到适合网页显示的尺寸。 压缩图像文件&#xff1a;使用图像压缩工具可…

戏剧之家杂志戏剧之家杂志社戏剧之家编辑部2024年第14期目录

文艺评论 南戏瓯剧跨文化传播研究 陈晓东;高阳;许赛梦; 3-7 论互联网时代的戏剧传播与批评——以西法大剧社和南山剧社为例 邬慧敏; 8-10 “左手荒诞&#xff0c;右手温情”——《西西弗神话》在戏剧《第七天》中的接受探究 赵稳稳; 11-13 戏剧研讨《戏剧之家》投稿…

[SAP ABAP] 数据类型

1.基本数据类型 示例1 默认定义的基本数据类型是CHAR数据类型 输出结果: 示例2 STRING数据类型用于存储任何长度可变的字符串 输出结果: 示例3 DATE数据类型用于存储日期信息&#xff0c;并且可以存储8位数字 输出结果: 提示Tips&#xff1a;日期和时间类型的变量可以直接进…

网络安全筑基篇——SQL注入

目录 前言 什么是SQL&#xff1f; 什么是SQL注入&#xff1f; SQL注入的危害有哪些&#xff1f; SQL注入有哪些类型&#xff1f; SQL注入的一些思路 首先得判断SQL注入是否存在 判断SQL注入点 判断数据库的一个类型 SQL注入的防范措施 前言 本文可能有些许的难以理解…

openh264 帧级码率控制源码分析

openh264 码率控制结构 关于 openh264 码率控制整体结构&#xff0c;可以参考&#xff1a;openh264 码率控制原理框架。 openh264 帧级码率控制介绍 函数关系图&#xff1a;从图可以看出&#xff0c;帧级码控的核心函数就是WelsRcPictureInitGom、WelsRcPictureInfoUpdateGo…

DAB-DETR

论文地址&#xff1a; https://arxiv.org/pdf/2201.12329 文章通过前人的经验得出&#xff0c;导致 DETR 训练速度慢的原因很大可能是因为 decoder 中 cross attention 这个模块&#xff0c;由上面的对比可以看出其与 self attention 的区别主要就在于query的不同。文章猜想两个…

LC15.三数之和、LC22括号生成

LC15.三数之和 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的…

【Python办公自动化之Word】

python办公⾃动化之-Word python-docx库 文章目录 python办公⾃动化之-Word1、安装python-docx库2、⽂档的结构说明3、基本操作语法3.1 打开⽂档3.2加⼊不同等级的标题3.3 添加⽂本3.4 设置字号插曲1&#xff1a;实战演示3.5 设置中⽂字体3.6 设置斜体3.7 设置粗体3.8⾸⾏缩进…

H3C防火墙抓包(图形化)

一.报文捕获 &#xff0c;然后通过wireshark查看报文 二.报文示踪 &#xff0c; 输入源目等信息&#xff0c; 查看报文的详情

使用Docker Compose运行Nginx

使用Docker Compose运行Nginx可以更方便地管理和配置多个容器。以下是步骤&#xff1a; 1. 安装Docker Compose 首先&#xff0c;确保已经安装了Docker和Docker Compose。如果没有安装&#xff0c;可以参考官方文档进行安装&#xff1a;Docker Compose安装指南 2. 创建项目目…

mongodb 集群安装

整体架构图&#xff1a; 1. 配置域名 Server1&#xff1a; OS version: CentOS Linux release 8.5.2111 hostnamectl --static set-hostname mongo01 vi /etc/sysconfig/network # Created by anaconda hostnamemong01 echo "192.168.88.20 mong1 mongo01.com mongo…

返回给前端数据的封装

返回格式如下&#xff1a; { "code": 200/400, "msg": "成功"/"失败", "total": n, "data": [ {}&#xff0c;{}]} 1.在common中新增Result 类&#xff0c;代码如下 package com.xxx0523.common; import lombo…

kylin-v10sp2-Babelfish for PostgreSQL

环境准备 x86_linux_kylin v10 sp2 1、依赖 yum makecache yum install -y uuid-devel 2、源代码 下载支持babelfish的pg&#xff0c;也是babelfish社区维护更新 cd /opt#pg源码&#xff0c;支持babelfish版 git clone https://github.com/babelfish-for-postgresql/post…

不同拷贝【写作中】

【写作中】 .clone() 深拷贝deepcopy() 深拷贝copy() 浅拷贝

酸性设计震撼登场,让你眼前一亮!

说起酸性&#xff08;ACID&#xff09;&#xff0c;你会想到什么&#xff1f;”我们通常会想到酸味&#xff0c;酸设计的视觉魅力是通过图形、颜色、排版给人复古、迷幻、黑暗、叛逆的感觉&#xff0c;反复几何图形和高饱和的颜色&#xff0c;使设计非常时尚&#xff0c;非常适…

css实现多行文本的展开收起

背景 在我们写需求时可能会遇到类似于这样的多行文本展开与收起的场景&#xff1a; 那么&#xff0c;如何通过纯css实现这样的效果呢&#xff1f; 实现的难点 &#xff08;1&#xff09;位于多行文本右下角的 展开收起按钮。 &#xff08;2&#xff09;展开和收起两种状态的…

Spatio-temporal Relation Modeling for Few-shot Action Recognition

标题&#xff1a;少样本动作识别的时空关系建模 源文链接&#xff1a;Thatipelli_Spatio-Temporal_Relation_Modeling_for_Few-Shot_Action_Recognition_CVPR_2022_paper.pdf (thecvf.com)https://openaccess.thecvf.com/content/CVPR2022/papers/Thatipelli_Spatio-Temporal_…

Pikachu靶场--RCE

参考借鉴 pikachu-RCE_pikachu rce-CSDN博客 Pikachu靶场-RCE远程命令/代码执行漏洞-CSDN博客 命令执行/代码执行/RCE&#xff08;CTF教程&#xff0c;Web安全渗透入门&#xff09;_bilibili exec"ping" 输入IP地址查看页面反应 可以在IP地址的后面拼接我们想要执行…

6.2 事件的创建,修改和删除

6.2.1 事件的概述 事件(Event)是在指定时刻才被执行的过程式数据库对象。 事件通过MySQL中一个很有特色的功能模块——事件调度器(Event Scheduler)进行监视&#xff0c;并确定其是否需要被调用。 MySQL的事件调度器可以精确到每秒钟执行一个任务&#xff0c;比操作系统的计…

CCF推荐会议必投攻略:这些顶级会议投完直通录取大门

CCF推荐会议必投攻略&#xff1a;这些顶级会议投完直通录取大门&#xff01; 会议之眼 快讯 CCF介绍 CCF&#xff08;China Computer Federation&#xff09;即中国计算机学会&#xff0c;前身是中国电子学会计算机专业委员会&#xff0c;成立于1962年。这是由从事计算机及相…