PHP 变量处理函数 serialize()

the PHP variable handling function, serialize()

提问人:Aaron 提问时间:3/18/2011 更新时间:3/19/2011 访问量:1140

问:

首先,我阅读了PHP手册,并对其进行了测试。 其次,我仍然不明白它到底是做什么的? 为什么要序列化变量?

PHP 序列化 变量

评论

0赞 Aaron 3/18/2011
我有点明白它会生成类型和结构,例如 s:12:“hello, world”;但是我为什么要使用它呢?我会在什么情况下使用它?
4赞 John Giotta 3/18/2011
en.wikipedia.org/wiki/Serialization

答:

0赞 jLuengas 3/18/2011 #1

它以能够传输和存储的形式写入变量。例如,在将变量写入文件、数据库或仅将其存储在 HTTP 会话中之前,必须对其进行序列化

5赞 Mark Baker 3/18/2011 #2

原因可能是将值存储在文本文件或数据库中。 serialize() 将非文本值转换为文本(例如二进制整数或浮点值),以便它们可以很容易地以这种格式存储,并且很容易用 unserialize() 转换回来......如果你真的看一个会话文件,那就是存储为序列化字符串的 $_SESSION 数组,当你执行 session_start() 时,可以很容易地转换回 $_SESSION 数组。

5赞 Adam Pointer 3/18/2011 #3

您可能不希望将变量序列化,但序列化对象和其他复杂数据结构很有用。

不要创建包含大量列的数据库表,而是创建一个包含主键和 blob 的表,并将类或数组序列化到其中。这样一来,你就拥有了一个非常灵活的系统,如果你需要向数据库表中添加新数据,你不必添加更多的列。

这是一个愚蠢的例子,但如果你仔细想想,将对象持久化到数据库中是非常有用的。

评论

0赞 lonesomeday 3/19/2011
这不是一个很好的例子,IMO。将数据作为序列化字符串存储在数据库中意味着不能对其使用常规的数据库查询。它偶尔有用,但不是该函数的主要用途。
0赞 Adam Pointer 3/19/2011
这就是为什么我说这是一个愚蠢的例子,我发现将购物车对象序列化到数据库中很有用,这样他们的购物车就可以很容易地取消序列化并处于活动状态,生成发票或其他任何东西。
2赞 Marc B 3/18/2011 #4

序列化单个变量没有多大意义。序列化数组或对象更有用:

$array = array(
     0 => 'hello',
     1 => 'there',
     'how' => 'are',
     'you' => '?'
);

$txt = serialize($array);
echo($txt); //

生产

a:4:{i:0;s:5:"hello";i:1;s:5:"there";s:3:"how";s:3:"are";s:3:"you";s:1:"?";}

你可以获取这个文本字符串,将其存储在数据库中,通过电子邮件发送,将其塞入文本文件,等等......然后稍后检索它并通过简单的调用将其转换回 PHP 数组。unserialize()

评论

0赞 Adam Pointer 3/19/2011
对序列化对象进行编码并将其发送到远程 Web 服务而不是 json 或 xml,或者这简直是疯狂吗?
0赞 Marc B 3/19/2011
JSON 和 XML 在支持方面更加通用 - 我想不出任何 Web 感知语言既不直接支持也不具有添加支持的库。PHP 的序列化更特定于语言。并不是说你不能在(比如)Java 或 C# 中使用这样的字符串,但既然你要跨语言,不妨使用更合适的东西,比如 XML/JSON。
0赞 Adam Pointer 3/19/2011
诚然,这只有在您创建自己的分布式系统而不是 Web 服务时才有用。
1赞 lonesomeday 3/18/2011 #5

序列化变量意味着“将其转换为字符串”。基本上,它是一种将变量转换为可以轻松存储以备将来使用的形式的方法。

想象一下这种情况:你有一个包含大量信息的数组。您需要将其存储在文本文件中,以便下次需要它时做好准备。默认情况下,将数组转换为字符串会产生意外结果。例如,执行以下操作:

file_put_contents('file.txt', array('foo', 'bar'));

将字符串放入文本文件中。你不能轻易地将其转换回数组。 将数组转换为以下内容:foobarserialize

file_put_contents('file.txt', serialize(array('foo', 'bar')));
// a:2:{i:0;s:3:"foo";i:1;s:3:"bar";}

这并不容易阅读,但 unserialize 函数可以很容易地将其转换回数组。

1赞 ChiCgi 3/19/2011 #6

PHP 中的 serialize 函数会将数据结构转换为可存储的字符串。序列化数据(例如变量、数组或对象)以存储在数据库或其他存储位置。取消序列化后,可以在检索数据后重复使用此数据。下面是一个示例:

$data = array("key"=>"value");
$serialized = serialize($data);

// Shows the serialized string representing the array:
// string(28) "a:1:{s:3:"key";s:5:"value";}"
var_dump($serialized);

$unserialized = unserialize($serialized);

// Shows the original array named $data:
// array(1) { ["key"]=>  string(5) "value" } 
var_dump($unserialized);