PHP序列化数据格式的示例详解
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">概述</a></li><li><a href="#_label1">基本数据类型序列化格式</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_0">布尔值(Boolean)</a></li><li><a href="#_lab2_1_1">整数(Integer)</a></li><li><a href="#_lab2_1_2">浮点数(Float/Double)</a></li><li><a href="#_lab2_1_3">字符串(String)</a></li><li><a href="#_lab2_1_4">NULL值</a></li></ul><li><a href="#_label2">复合数据类型序列化格式</a></li><ul class="second_class_ul"><li><a href="#_lab2_2_5">数组(Array)</a></li><li><a href="#_lab2_2_6">对象(Object)</a></li></ul><li><a href="#_label3">特殊类型</a></li><ul class="second_class_ul"></ul><li><a href="#_label4">序列化字符串结构总结</a></li><ul class="second_class_ul"></ul><li><a href="#_label5">安全注意事项</a></li><ul class="second_class_ul"></ul><li><a href="#_label6">实用场景</a></li><ul class="second_class_ul"></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>概述</h2><p>PHP序列化是将PHP变量(包括对象)转换为可存储或传输的字符串表示形式的过程。了解这些序列化格式对于数据处理、调试和安全性分析非常重要。本文将详细介绍PHP中各种数据类型的序列化表示方式。</p>
<p class="maodian"><a name="_label1"></a></p><h2>基本数据类型序列化格式</h2>
<p class="maodian"><a name="_lab2_1_0"></a></p><h3>布尔值(Boolean)</h3>
<p>格式:<code>b:<value></code></p>
<ul><li>b:1 表示 true</li><li>b:0 表示 false</li></ul>
<p>示例:</p>
<div class="jb51code"><pre class="brush:php;">serialize(true); // 输出: "b:1"
serialize(false);// 输出: "b:0"
</pre></div>
<p class="maodian"><a name="_lab2_1_1"></a></p><h3>整数(Integer)</h3>
<p>格式:<code>i:<value></code></p>
<p>示例:</p>
<div class="jb51code"><pre class="brush:php;">serialize(42); // 输出: "i:42;"
serialize(-100); // 输出: "i:-100;"
</pre></div>
<p class="maodian"><a name="_lab2_1_2"></a></p><h3>浮点数(Float/Double)</h3>
<p>格式:<code>d:<value></code></p>
<p>示例:</p>
<div class="jb51code"><pre class="brush:php;">serialize(3.14); // 输出: "d:3.14;"
serialize(-0.5); // 输出: "d:-0.5;"
</pre></div>
<p class="maodian"><a name="_lab2_1_3"></a></p><h3>字符串(String)</h3>
<p>格式:<code>s:<length>:"<value>";</code></p>
<p>示例:</p>
<div class="jb51code"><pre class="brush:php;">serialize("hello"); // 输出: "s:5:"hello";"
serialize("测试");// 输出: "s:6:"测试";" (UTF-8编码下每个中文字符占3字节)
</pre></div>
<p class="maodian"><a name="_lab2_1_4"></a></p><h3>NULL值</h3>
<p>格式:<code>N;</code></p>
<p>示例:</p>
<div class="jb51code"><pre class="brush:php;">serialize(null); // 输出: "N;"
</pre></div>
<p class="maodian"><a name="_label2"></a></p><h2>复合数据类型序列化格式</h2>
<p class="maodian"><a name="_lab2_2_5"></a></p><h3>数组(Array)</h3>
<p>格式:<code>a:<length>:{<key-value pairs>}</code></p>
<p>数组的序列化包含以下部分:</p>
<ul><li>数组元素数量</li><li>每个元素的键和值序列化表示</li></ul>
<p>示例:</p>
<div class="jb51code"><pre class="brush:php;">serialize();
// 输出: "a:3:{i:0;i:1;i:1;i:2;i:2;i:3;}"
serialize(["name" => "John", "age" => 30]);
// 输出: "a:2:{s:4:"name";s:4:"John";s:3:"age";i:30;}"
</pre></div>
<p class="maodian"><a name="_lab2_2_6"></a></p><h3>对象(Object)</h3>
<p>格式:<code>O:<class_name_length>:"<class_name>":<number_of_properties>:{<properties>}</code></p>
<p>对象序列化包含:</p>
<ul><li>类名长度和类名</li><li>属性数量</li><li>每个属性的名称和值(包括可见性)</li></ul>
<p>示例:</p>
<div class="jb51code"><pre class="brush:php;">class User {
public $name = "Alice";
protected $id = 123;
private $secret = "xyz";
}
serialize(new User());
/* 输出:
O:4:"User":3:{
s:4:"name";s:5:"Alice";
s:5:"*id";i:123;
s:11:"Usersecret";s:3:"xyz";
}
*/
</pre></div>
<p>注意:受保护属性前缀为*,私有属性前缀为类名。</p>
<p class="maodian"><a name="_label3"></a></p><h2>特殊类型</h2>
<p>引用(Reference)</p>
<p>当序列化包含引用的变量时,PHP会使用引用标记:</p>
<p>格式:<code>R:<reference_number>;</code></p>
<p>示例:</p>
<div class="jb51code"><pre class="brush:php;">$a = ;
$b = &$a;
serialize([$a, $b]);
// 输出: "a:2:{i:0;a:1:{i:0;i:1;}i:1;R:2;}"
</pre></div>
<p class="maodian"><a name="_label4"></a></p><h2>序列化字符串结构总结</h2>
<p>完整的PHP序列化字符串通常具有以下特点:</p>
<ul><li>以数据类型标识符开头(b, i, d, s, a, O, N等)</li><li>使用冒号分隔类型和值</li><li>字符串值用双引号括起来</li><li>使用分号作为终止符</li><li>复合类型使用花括号表示嵌套结构</li></ul>
<p class="maodian"><a name="_label5"></a></p><h2>安全注意事项</h2>
<p>不要反序列化不可信数据:PHP反序列化可能执行代码(通过__wakeup()或__destruct()魔术方法)</p>
<p>考虑使用JSON进行安全数据传输</p>
<p>对序列化数据进行签名或加密以验证完整性</p>
<p class="maodian"><a name="_label6"></a></p><h2>实用场景</h2>
<ul><li>数据存储(如会话、缓存)</li><li>进程间通信</li><li>对象持久化</li><li>调试复杂数据结构</li></ul>
<p>通过理解PHP序列化格式,开发者可以更好地处理数据转换、调试序列化问题和构建安全应用程序。</p>
頁:
[1]