什么是数据序列化?

时间:2012-08-05 16:11:04

标签: php javascript serialization definition

首先,我无法从PHP手册中的WikiPedia甚至serialize函数中清楚地定义它。我需要知道一些我们需要术语序列化以及没有它的情况如何发展的情况?换句话说,在你必须要序列化的地方,没有它,你的代码将缺少一些重要的功能。

5 个答案:

答案 0 :(得分:73)

什么序列化?

序列化是编码为其他语言的对象。 例如,PHP中有一个数组,如下所示:

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

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

语言有多种选择,但想法是一样的: 该数组必须被编码(或翻译)成文本或字节,可以写入文件或通过网络发送。 例如,如果你

$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(具有特殊目的)
  • 字节
  • ...
  • ...
  • ...
  • 您自己的格式(您可以创建自己的序列化格式并使用它,但这是一件大事,大部分时间都不值得)

希望我帮忙!

答案 1 :(得分:15)

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

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

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

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

答案 2 :(得分:4)

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

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

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

不是单独遍历每个数组成员而是编写它只是:

$dataString = serialize($blub);

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

答案 3 :(得分:3)

  

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

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

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

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

  

换句话说,你必须要求序列化而没有序列化,你的代码将缺少一些重要的功能。

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

答案 4 :(得分:1)

由于您已使用javascript对其进行了标记,因此一种序列化可能会形成序列化。

以下是jQueryprototype.JS等效项的参考资料。

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

所以考虑实际使用情况..

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

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