什么是数据序列化

What is data serialization?

本文关键字:序列化 数据 什么      更新时间:2023-09-26

首先,我无法从WikiPedia甚至PHP手册中的serialize函数中得到它的明确定义。我需要知道在某些情况下,我们需要术语序列化,如果没有它,情况会如何?换句话说,如果您需要序列化,而没有序列化,您的代码将缺少一些重要功能。

什么是序列化

序列化将对象编码为另一种格式
例如,您在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格式是唯一可能的格式吗
不,不,还有一次不。有很多格式。

  • XML(例如,使用WSDL或XHTML等模式)
  • Bytes、Protobuf等
  • Yaml
  • 您自己的格式(您可以创建自己的序列化格式并使用它,但这是一件大事,在大多数情况下都不值得)

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

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

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

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

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

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

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

不需要单独遍历每个数组成员并编写它,只需:

$dataString = serialize($blub);

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

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

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

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

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

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

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

因为您已经用javascript标记了它,所以一种序列化可以是形式序列化。

以下是jQuery和原型的参考资料。JS等价物。

它们的基本功能是将表单输入值序列化为逗号分隔的名称值对

因此,考虑到实际使用情况。。

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

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