如何使用 php 序列化()和反序列化()

我的问题很简单。

我没有找到任何例子来满足我的需要,究竟是什么 serialize()unserialize()意味着 php?他们只是给出了一个例子——序列化一个数组,并以一种无法解释的格式显示一个输出。通过他们的行话真的很难理解基本概念。

编辑:

<?php


$a= array( '1' => 'elem 1', '2'=> 'elem 2', '3'=>' elem 3');
print_r($a);
echo ("<br></br>");
$b=serialize($a);
print_r($b);


?>

产出:

Array ( [1] => elem 1 [2] => elem 2 [3] => elem 3 )


a:3:{i:1;s:6:"elem 1";i:2;s:6:"elem 2";i:3;s:7:" elem 3";}

我无法理解第二个输出。除此之外,谁能举个例子说明一下在使用 php 数组之前我需要序列化它的情况?

289302 次浏览

当您想要使 php 值可存储时,必须将其转换为字符串值,这就是 序列化()所做的。取消序列化()做相反的事情。

来自 http://php.net/manual/en/function.serialize.php:

生成值的可存储表示形式。 这对于存储或传递 PHP 值而不丢失其类型和结构非常有用。

本质上,它获取一个 php 数组或对象并将其转换为字符串(然后您可以根据需要传输或存储该字符串)。

UnSeries 用于将字符串转换回对象。

大多数存储介质可以存储 绳子类型。它们不能直接存储 PHP 数据结构(如数组或对象) ,也不应该这样做,因为这样会将数据存储介质与 PHP 耦合起来。

相反,serialize()允许您将这些结构之一存储为字符串。它可以用 unserialize()从它的字符串表示反序列化。

如果您熟悉 json_encode()json_decode()(以及一般的 JSON) ,那么概念是相似的。

PHP 数组或对象或其他 复杂的数据结构不能在 运行 PHP 脚本之外传输、存储或以其他方式使用。如果你想要 坚持这样一个复杂的数据结构超越一个单一的脚本运行,你需要 连载它。这只是意味着把结构放到一个“较低的公分母”,可以由 PHP 以外的东西处理,如数据库,文本文件,套接字。标准的 PHP 函数 serialize就是 格式,它将数据结构序列化为 PHP 独有的字符串表示形式,并且可以使用 unserialize反转为 PHP 对象。但是还有许多其他格式,如 JSON 或 XML。


以下面这个常见问题为例:

如何将 PHP < em > array 传递给 Javascript?

PHP 和 Javascript 只能通过字符串进行通信。您可以很容易地将字符串 "foo"传递给 Javascript。您可以很容易地将数字 1传递给 Javascript。您可以轻松地将布尔值 truefalse传递给 Javascript。但是如何将这个数组传递给 Javascript 呢?

Array ( [1] => elem 1 [2] => elem 2 [3] => elem 3 )

对于 PHP/Javascript,JSON 实际上是更好的序列化格式:

{ 1 : 'elem 1', 2 : 'elem 2', 3 : 'elem 3' }

Javascript 可以很容易地将其反转为实际的 Javascript 数组。

不过,这也是同一数据结构的有效表示:

a:3:{i:1;s:6:"elem 1";i:2;s:6:"elem 2";i:3;s:7:" elem 3";}

但是几乎只有 PHP 使用它,其他任何地方都很少支持这种格式。
这种情况非常普遍,但也得到了很好的支持:

<array>
<element key='1'>elem 1</element>
<element key='2'>elem 2</element>
<element key='3'>elem 3</element>
</array>

在许多情况下,您需要将 复杂的数据结构作为字符串传递。将任意数据结构表示为字符串的序列化解决了这个问题。

是的,我可以。假设我们需要跟踪您的系统意味着在您的系统中有多个管理员和子管理员,所有这些都可以插入或更新或编辑任何信息。稍后您需要知道是谁做出了这个更改。为了解决这个问题,您需要序列化。

  **Explain:**Create a table named history which stores all changes. Each time there is a change insert a new row in this table. It might have this fields:


history(id,target_table(name of the table), target_id (ID of the saved entry),create/edit/change data (serialized data of the saved row),date)

我希望这能帮到你。

PHP seralize () unseralize ()的用法

Http://freeonlinetools24.com/serialize

echo '<pre>';
// say you have an array something like this
$multidimentional_array= array(
array(
array("rose", 1.25, 15),
array("daisy", 0.75, 25),
array("orchid", 4, 7)
),
array(
array("rose", 1.25, 15),
array("daisy", 0.75, 25),
array("orchid", 5, 7)
),
array(
array("rose", 1.25, 15),
array("daisy", 0.75, 25),
array("orchid", 8, 7)
)
);


// serialize
$serialized_array=serialize($multidimentional_array);
print_r($serialized_array);

就会得到这样的输出

a:3:{i:0;a:3:{i:0;a:3:{i:0;s:4:"rose";i:1;d:1.25;i:2;i:15;}i:1;a:3:{i:0;s:5:"daisy";i:1;d:0.75;i:2;i:25;}i:2;a:3:{i:0;s:6:"orchid";i:1;i:4;i:2;i:7;}}i:1;a:3:{i:0;a:3:{i:0;s:4:"rose";i:1;d:1.25;i:2;i:15;}i:1;a:3:{i:0;s:5:"daisy";i:1;d:0.75;i:2;i:25;}i:2;a:3:{i:0;s:6:"orchid";i:1;i:5;i:2;i:7;}}i:2;a:3:{i:0;a:3:{i:0;s:4:"rose";i:1;d:1.25;i:2;i:15;}i:1;a:3:{i:0;s:5:"daisy";i:1;d:0.75;i:2;i:25;}i:2;a:3:{i:0;s:6:"orchid";i:1;i:8;i:2;i:7;}}}

如果你想得到原始的数组,只需要使用 PHP 反序列化()函数

$original_array=unserialize($serialized_array, ['allowed_classes' => false]);
var_export($original_array);

希望这个能帮上忙

注意: 出于安全原因,在非序列化中将 allowed_classes设置为 false。参见警告 https://www.php.net/manual/en/function.unserialize.php

<?php
$a= array("1","2","3");
print_r($a);
$b=serialize($a);
echo $b;
$c=unserialize($b, ['allowed_classes' => false]);
print_r($c);

运行这个程序它的回声输出

a:3:{i:0;s:1:"1";i:1;s:1:"2";i:2;s:1:"3";}

注意: 出于安全原因,在取消序列化时将 allowed_classes设置为 false。


给你
数组的大小
数组数的计数
S = 数组值的大小

您可以使用序列化将数据数组存储在数据库 < BR > 中,并且可以检索和非序列化数据以使用。请参阅警告 < a href = “ https://www.php.net/Manual/en/function. unseralize.php”rel = “ nofollow norefrer”> https://www.php.net/manual/en/function.unserialize.php

基本上,在序列化数组或对象时,只需将其转换为有效的字符串格式,这样就可以轻松地将它们存储在 php 脚本之外。

  1. 使用序列化将对象的状态保存在数据库中(让我们以 User 类为例)接下来取消序列化数据,将以前的状态加载回对象(方法不是序列化器,你需要包含对象类才能使用它)
    • 用户个性化

注意,对于对象,应该使用 magic _ _ sleep 和 _ _ wakeup 方法。 _ _ sleep 由 seralize ()调用。Sleep 方法将返回一个数组,该数组包含您希望持久化的对象的值。

_ _ wakeup 由 unseralize ()调用。唤醒方法应该获取未序列化的值,并在对象中对其进行初始化。

为了在 php 和 js 之间传递数据,需要使用 json _ encode 将 php 数组转换为有效的 json 格式。或者反过来,使用 JSON.parese ()将输出数据(字符串)转换为有效的 json 对象。您需要这样做来利用本地存储。(离线数据访问)

求你了!求你了!求你了!不要序列化数据并将其放入数据库。序列化也可以这样使用,但是它忽略了数据库引擎中固有的关系数据库和数据类型。这样做会使数据库中的数据不可移植,难以读取,并且会使查询复杂化。如果你想让你的应用程序可以移植到其他语言,比如说你发现你想在你的应用程序的某些部分使用 Java,在其中使用 Java 是有意义的,那么序列化将会成为一个痛苦的问题。您应该始终能够查询和修改数据库中的数据,而无需使用第三方中介工具来操作要插入的数据。

它使得维护代码、带有可移植性问题的代码以及迁移到其他 RDMS 系统、新模式等更加困难的数据变得非常困难。它还有一个额外的缺点,那就是基于已序列化的字段之一搜索数据库会很麻烦。

这并不是说 Series ()是无用的。它不是... 一个很好的使用它的地方可能是一个缓存文件,其中包含数据密集型操作的结果,例如。还有很多其他的... 只是不要滥用序列化,因为下一个出现的家伙将会有一个维护或迁移的噩梦。

一个很好的序列化()和非序列化()示例可以像下面这样:

$posts = base64_encode(serialize($_POST));
header("Location: $_SERVER[REQUEST_URI]?x=$posts");

在页面上取消序列化

if($_GET['x']) {
// unpack serialize and encoded URL
$_POST = unserialize(base64_decode($_GET['x']));
}
preg_match_all('/\".*?\"/i', $string, $matches);
foreach ($matches[0] as $i => $match) $matches[$i] = trim($match, '"');