代码编织梦想

目录

一、序列化的概念

二、序列化和反序列化的作用:

三、PHP序列化函数

四、各种数据类型序列化后的效果

(1) NULL的序列化

(2) Boolean型数据的序列化

(3) Integer型数据的序列化

(4)Double型数据的序列化

(5) String型数据的序列化

(6) 数组的序列化

(7) 对象的序列化


一、序列化的概念

将对象或者数组转化为可存储的字符串

在PHP中使用serialize()函数来将对象或者数组进行序列化,并返回一个包含字节流的字符串来表示。

我们使用类的序列化比较多,所以这里就用一个序列化对象的例子来演示:

<?php
class TEST {
    public $data;
    private $pass;

    public function __construct($data, $pass)
    {
        $this->data = $data;
        $this->pass = $pass;
    }
}
$number = 34;
$str = 'user';
$bool = true;
$null = NULL;
$arr = array('a' => 10, 'b' => 200);
$test = new TEST('uu', true);
var_dump(serialize($number));
var_dump(serialize($str));
var_dump(serialize($bool));
var_dump(serialize($null));
var_dump(serialize($arr));
var_dump(serialize($test));
?>

结果:

string(5) "i:34;"
string(11) "s:4:"user";"
string(4) "b:1;"
string(2) "N;"
string(33) "a:2:{s:1:"a";i:10;s:1:"b";i:200;}"
string(57) "O:4:"TEST":2:{s:4:"data";s:2:"uu";s:10:" TEST pass";b:1;}"

所以序列化对于不同类型得到的字符串格式为:

  • String: s:size:value;
  • Integer: i:value;
  • Boolean: b:value;(保存1或0)
  • Null: N;
  • Array: a:size:{key definition;value definition;(repeated per element)}
  • Object: O:strlen(object name):object name:object size:{s:strlen(property name):property name:property definition;(repeated per property)}

    私有属性的成员变量序列化:

<?php
class TEST {

    private $data='私有属性';
    function self()
    {
        echo $this->data;
    }
}
$a = new TEST();
echo serialize($a);
?>

结果:

为什么会出现不明符号,因为变量是private的所以序列号的时候会在两侧加入空字节,而且是private属性的变量都会在变量前面加上加上类名。

二、序列化和反序列化的作用:

1、为了有效地存储或传递数据,同时不丢失其类型和结构,经常需要利用序列化和反序列化函数对数据进行处理。

2、反序列化函数返回字符串,此字符串包含了表示值的字节流,可以存储于任何地方

3、反序列化函数对单一的已序列化的变量进行操作,将其转换成员来的值

3、这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性

PHP语言中常用的序列化和反序列化函数有serialize、unserialize、json_encode、json_decode

有些很简单的比喻也可以去了解到,方便理解。

三、PHP序列化函数

serialize函数

序列化是将变量或对象转换成字符串的过程。

举例:

<?php
class LOL {
    public $name = '滑板鞋'; //放在类外为变量 //放在类内为成员属性
    private $sex = '女';
    protected $jn = '拔毛';

    function  xixue () {
        echo $this->name;// $this 是在当前类里调用
        echo $this->jn;
    }
}
$a = new LOL();
print_r($a);
echo  PHP_EOL;    //把LOL实体化后的对象a,输出
echo serialize($a);

输出:

LOL Object
(
    [name] => 滑板鞋
    [sex:LOL:private] => 女
    [jn:protected] => 拔毛
)

O:3:"LOL":3:{s:4:"name";s:9:"滑板鞋";s:8:" LOL sex";s:3:"女";s:5:" * jn";s:6:"拔毛";}

四、各种数据类型序列化后的效果

(1) NULL的序列化

在PHP中,NULL被序列化为N。

<?php
$str=NULL;
$xl_str=serialize($str);
print_r($xl_str);
?>

输出:

N;

(2) Boolean型数据的序列化

Boolean型数据被序列化成b:。其中,表示0或1。当boolean型数据为false时,为0,否则为1

<?php
$str1=true;
$str2=false;
$xl_str1=serialize($str1);
$xl_str2=serialize($str2);
print_r($xl_str1);
echo PHP_EOL;
print_r($xl_str2);
?>

输出:

b:1;
b:0;

(3) Integer型数据的序列化

Interger型(整型)数据被序列化为i:.其中为一个整型数,范围为:-2147483648——2147483647,如果被序列化的数字超过这个范围,则会被序列化为浮点型而不是整型。如果序列化后的数字超过这个范围,则反序列化时不会反悔期望的数值(PHP本身序列化时不会发生这个问题)

<?php
$str1=123;
$xl_str1=serialize($str1);
print_r($xl_str1);
?>

输出:

i:123;

(4)Double型数据的序列化

Double型Double型(浮点型)数据被序列化为d:。其中为一个浮点数,其范围与PHP的浮点数范围一样,可以表示成整数形式、浮点数形式和科学计数法形式。如果序列化无穷大,则为INF;如果序列化负无穷大则为-INF。如果序列化后的数字超过PHP能表示的最大值,则反序列化时返无穷大(INF);如果如果序列化的数据为非数字,则被序列化为NAN,NAN反序列化时返回0,其他语言可以将NAN反序列化为相应的语言所支持的NAN表示形式数据的序列化。

<?php
$double1=1.23;
$xl_str1=serialize($double1);
print_r($xl_str1);
?>

输出:

d:1.23;

(5) String型数据的序列化

String型(字符串型)数据序列化为s:<length>:"<value>"

<?php
$str1="test xiaohua";
$xl_str1=serialize($str1);
print_r($xl_str1);
?>

输出:

s:12:"test xiaohua";

(6) 数组的序列化

数组序列化通常被序列化为

a:<n>:{<key 1><value 1><key 2><value 2><key3><value 3><key 4><value 4>…}
<n>表示数组个数
<key>表示数组下标
<value>表示与下标相对应的数组元素值
<?php
$shu=array('xiaohua1','xiaohua2','xiaohua3');
$xl_str1=serialize($shu);
print_r($xl_str1);
?>

输出:

a:3:{i:0;s:8:"xiaohua1";i:1;s:8:"xiaohua2";i:2;s:8:"xiaohua3";}

(7) 对象的序列化

对象通常被序列化称:

O:<length>:"<class name>":<n>:{<field name 1><field value 1><field name 2><field value 2>...<field name n><field value n>}
<length>:对象类名字符串长度
<class name>:对象的类名
<n>:对象中字段数 包括var、protected、private、public声明的字段,不包括static和const声明的静态字符串
<field name 1><field value 1>:每个字段对应的每个字段名
<?php
class xiaohua{
public $str='xiaohua';
public $str2="huahua";
    function Func(){ 
    print("this is Func''"); 
    } 
    }
$aaa=new xiaohua;
$se=serialize($aaa);
print $se;
?>

输出:

O:7:"xiaohua":2:{s:3:"str";s:7:"xiaohua";s:4:"str2";s:6:"huahua";}

解读:O表示对象,7是字段长度,对象内容为xiaohua,2表示xiaohua对象有两个成员属性。s表示字符串类型,3是字段值长度 字段名称是str。s表示字符串7表示字段值长度 字段名称是xiaohua

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_60463414/article/details/126322225

彻底理解序列化和反序列化-爱代码爱编程

https://tech.meituan.com/2015/02/26/serialization-vs-deserialization.html 目录 摘要 简介 一、定义以及相关概念 数据结构、对象与二进制串 二、序列化协议特性 通用性 强健性/鲁棒性 可调试性/可读性 性能 可扩展性/兼容性 安全性/访问限制 三、序列化和反

PHP序列化与反序列化-爱代码爱编程

文章目录 前言一、序列化与反序列化二、魔术函数1.序列化2.反序列化3.几个魔法函数的调用三、反序列化漏洞1.__wakeup( )绕过2.POP链总结 前言 概念: 这其实是为了解决 PHP 对象传递的一个问题,因为 PHP 文件在执行结束以后就会将对象销毁,那么如果下次有一个页面恰好要用到刚刚销毁的对象就会束手无策,总不能你永远不让它销毁

ctf中的php序列化与反序列化-爱代码爱编程

ctf中的php序列化与反序列化 刚开始学的php序列化与反序列化,有点雨里雾里的,于是做个笔记~~ 首先我们来了解一下概念知道他是怎么样的一个东西: 序列化(串行化):是将变量转换为可保存或传输的字符串的过程; 反序列化(反串行化):就是在适当的时候把这个字符串再转化成原来的变量使用。 这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性

php序列化有什么好处,php为什么要序列化-爱代码爱编程

序列化就是是将对象转换为容易传输的格式的过程,一般情况下转化为流文件,放入内存或者IO文件中。 例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象,或者和其它应用程序共享使用。反之,反序列化根据流重新构造对象。 PHP序列化:(推荐学习:PHP编程从入门到精通)string serialize

反序列化学习之PHP反序列化&POP链构造-爱代码爱编程

反序列化学习(一) 前言 反序列化漏洞的学习贯穿了我的整个网安学习过程,从刚开始参加纳新考核到现在,反序列化的题目一直是难题,挡在学习的路上。 这次刷完了ctfshow的反序列化漏洞的相关题目,打算借这次机会重新总结一遍反序列化漏洞的相关知识。 反序列化漏洞的种类非常的多,在很多语言环境下你都会发现序列化储存信息的方式,所以反序列化漏洞也出现在了各

PHP反序列化(原理)-爱代码爱编程

一.PHP面向对象编程 1.面向对象编程的基本概念 在面向对象的程序设计OOP中,对象是一个由信息及对信息进行处理的描述所组成的整体,是对现实世界的抽象。 对象的主要三个特性:对象的行为,对象的形态,对象的表示 二.PHP序列化和反序列化 1.有时候需要把一个对象在网络上传输,为了方便传输,可以把整个对象转化为二进制串,等到达另一端时,再还原为原

sqlmap自动注入-request参数_网络点点滴的博客-爱代码爱编程

提交数据段 --data get / post 都适用 sqlmap.py -u "http://192.168.0.119/mutillidae/index.php?page=login.php" --data="us

php-字符串函数_(-^_^-)的博客-爱代码爱编程

字符串函数 strlen() :返回字符串的长度(字节数)strtoupper() 函数把字符串转换为大写strtolower() 函数把字符串转换为小写trim() 函数移除字符串两侧的空白字符或其他预定义字符ltrim() 函移除字符串左侧的空白字符或其他预定义字符。rtrim() 函数移除字符串右侧的空白字符或其他预定义字符等等等可以去查找相关的地