54

First of all, I couldn't get clear definition of it from WikiPedia or even from serialize function in the PHP manual. I need to know some cases where we need the term serialization and how things are going without it? In other words, Where you need serialization and without it your code will be missing some important feature.

4

5 回答 5

106

什么是序列化?

序列化将对象编码为另一种格式。
例如,您在 PHP 中有一个这样的数组:

$array = array("a" => 1, "b" => 2, "c" => array("a" => 1, "b" => 2));

然后您想将其存储在文件中或发送到其他应用程序。

有几种格式选择,但想法是一样的:数组必须被编码(或者你可以说“翻译”)成文本或字节,可以写入文件或通过网络发送。
例如,在 PHP 中,如果您:

$data = serialize($array);

你会得到这个:

a:3:{s:1:"a";i:1;s:1:"b";i:2;s:1:"c";a:2:{s:1:"a";i:1;s:1:"b";i:2;}}

这是 PHP 理解的 PHP 特定的序列化格式,反之亦然,因此您可以使用它来反序列化对象。
例如,您将一个序列化的数组存储在一个文件中,并希望它作为数组返回到您的代码中:

$array = unserialize($data);

但您可以选择不同的序列化格式,例如 JSON:

$json = json_encode($array);

会给你这个:

{"a":1,"b":2,"c":{"a":1,"b":2}}

结果不仅易于保存、人眼读取或通过网络发送,而且几乎所有其他语言(JavaScript、Java、C#、C++ ......)也可以理解

结论
序列化将对象转换为另一种格式,以防您想要存储或共享数据。

有没有什么情况,你不能做任何事情,只能序列化它?

不,但是序列化通常会使事情变得更容易。

JSON 和 PHP 格式是唯一可能的格式吗?
不,不,不,还有一次不。有很多格式。

  • 具有 SOAP、WSDL 等后继者的 XML(具有特定目的)
  • 字节、Protobuf 等
  • yaml
  • ...
  • ...
  • 您自己的格式(您可以创建自己的序列化格式并使用它,但大多数时候这是一件大事而且不值得)
于 2012-08-05T16:28:53.653 回答
21

序列化是将一些内存对象转换为另一种格式的过程,该格式可用于存储在文件中或通过网络发送。反序列化是逆过程,这意味着实际的对象实例是从给定的对象序列化表示中恢复的。这在各种系统之间进行通信时非常有用。

序列化格式可以是可互操作的或不可互操作的。可互操作的格式(例如 JSON、XML 等)允许使用给定平台序列化某些对象并使用不同平台反序列化它。例如,使用 JSON,您可以使用 javascript 序列化对象并通过网络将其发送到 PHP 脚本,该脚本将反序列化对象并使用它。

serialize()PHP 函数使用不可互操作的格式。这意味着只有 PHP 可以用来序列化和反序列化对象。

您可以使用json_encodejson_decode()函数以使用 JSON 可互操作格式序列化/反序列化 PHP 对象。

于 2012-08-05T16:17:34.617 回答
4

序列化是将数据(例如变量)转换为字符串等表示的过程,可以轻松地从例如文件或数据库中写入和读取。

用例?有很多,但通常它围绕着将复杂的嵌套数组或对象转换为可以保存并稍后读取以检索相同结构的简单字符串的想法。例如,假设您在 php 中有:

$blub = array();
$blub['a'] = 1;
$blub['a']['b'] = 4;
$blub['b'] = 27;
$blub['b']['b'] = 46;

与其单独遍历每个数组成员并编写它,不如只:

$dataString = serialize($blub);

序列化的数组已经准备好作为一个简单的字符串写入任何地方,这样再次检索这个字符串并对其执行 unserialize() 可以获得与之前完全相同的数组结构。是的,就是这么简单。

于 2012-08-05T16:24:38.057 回答
3

我需要知道一些我们需要术语序列化的情况以及没有它的情况如何?

如果您需要存储仅在特定时间点有效的完整结构(例如包含所有相关数据(如客户地址、发件人地址、产品位置、税收计算等)的发票),序列化会变得很方便。

所有这些数据都将在未来发生变化,新的税收法规可能会出台,客户地址会发生变化,产品会过时。但是发票仍然需要有效并存储。

这可以通过序列化来实现。像快照一样。内存中的对象被序列化为可以存储的(通常类似于 PHP)二进制形式。它可以在以后(并在不同的环境中)恢复使用。就像这个发票示例:十年后,数据仍然可以读取,并且发票对象与十年前相同。

换句话说,如果您必须需要序列化,而没有它,您的代码将缺少一些重要功能。

那是一个例子。并不是你总是需要它,但如果事情变得更复杂,序列化可能会有所帮助。

于 2012-08-05T16:35:21.770 回答
1

由于您已将其标记为javascript,因此一种序列化可能是表单序列化。

以下是jQueryprototype.JS等价物的参考资料。

他们基本上所做的是将表单输入值序列化为逗号分隔的名称-值对

所以考虑实际使用..

$.ajax({
   url : 'insert.php?a=10,b=15' //values serialized via .serialize()
   type: 'GET'
});

你可能会$GET["a"]检索这些值,不过我不熟悉 PHP。

于 2012-08-05T16:13:31.633 回答