什么是数据序列化?

31 javascript php serialization definition

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

Dov*_*kas 79

序列化是什么?

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

$array = array("a" => 1, "b" => 2, "c" => array("a" => 1, "b" => 2));
Run Code Online (Sandbox Code Playgroud)

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

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

$data = serialize($array);
Run Code Online (Sandbox Code Playgroud)

你会得到这个:

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;}}
Run Code Online (Sandbox Code Playgroud)

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

$array = unserialize($data);
Run Code Online (Sandbox Code Playgroud)

但您可以选择其他序列化格式,例如JSON.

$json = json_encode($array);
Run Code Online (Sandbox Code Playgroud)

会给你这个:

{"a":1,"b":2,"c":{"a":1,"b":2}}
Run Code Online (Sandbox Code Playgroud)

结果不仅可以轻松保存,通过人眼阅读或通过网络发送,但几乎所有其他语言都可以理解(Javascript,Java,C#,C++ .....)

结束语 序列化是对其他语言的对象转换,以防您想要存储或共享数据.

有什么情况,你不能做任何事情,但序列化吗?

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

JSON和PHP格式是唯一可能的格式吗? 不,不,不,再多一次没有.有很多格式.

  • 具有SOAP,WSDL等后继的XML(具有特殊目的)
  • 字节
  • ...
  • ...
  • ...
  • 您自己的格式(您可以创建自己的序列化格式并使用它,但这是一件大事,不值得,大部分时间)

希望我帮忙!

  • 在许多情况下,我认为序列化的很大一部分就是*与语言无关*.当您选择序列化方法时,您不会选择一种语言,而是选择*两点之间支持的表示,这两种点可以是相同或不同的语言,将其从语言本机结构中解释出来. (3认同)
  • 如何将内存中的对象引用发送到其他计算机或保存到磁盘而不进行序列化?在我看来,这不仅更难,而且是不可能的。 (2认同)

Dar*_*rov 16

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

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

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

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

  • 这应该是公认的答案,另一个有未解决的争议:P (6认同)
  • 不完全是 数组不是序列化的数据。数组存在于内存中。它们是对象。一旦使用某种格式对它们进行序列化,它们就会转换为某种字节表示形式,可以保存或通过网络发送。确切的表示形式取决于您选择的序列化格式。 (2认同)

Mah*_*ahn 6

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

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

$blub = array();
$blub['a'] = 1;
$blub['a']['b'] = 4;
$blub['b'] = 27;
$blub['b']['b'] = 46;
Run Code Online (Sandbox Code Playgroud)

不必单独遍历每个数组成员并将其写入,而是可以:

$dataString = serialize($blub);
Run Code Online (Sandbox Code Playgroud)

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