【问题标题】:What is data serialization?什么是数据序列化?
【发布时间】:2012-08-02 19:32:33
【问题描述】:

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

【问题讨论】:

  • 你说的我们需要term序列化是什么意思?序列化是一种描述数据结构的技术,其中包含嵌入在数据中的结构本身的信息。 JSON 是一种轻量级的序列化类型,例如,{prop:{prop:1}}。将其传输到另一台计算机,然后您可以使用与prop.prop 相同的基本关系来处理该对象的属性。
  • 我的意思是当我们需要它的时候?简单!
  • 当您需要跨越某个边界的数据结构时,您需要在以后的某个时间恢复相同的结构。您以比任何特定的单一键变量映射更详细的方式描述数据。
  • @JaredFarrish 所以你的意思是我可以用我自己的方式序列化数据,而序列化这个词来自于制作系列。即我们能否将数组视为序列化数据?
  • 如果你愿意,当然我想你可以制作自己的序列化方法,但在大多数情况下确实没有必要。有很多方法可以做到这一点,json_encode 是一种轻量级并且已经处理数组的方法。

标签: php javascript serialization definition


【解决方案1】:

什么是序列化?

序列化将对象编码为另一种格式。
例如,您在 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 有 SOAP、WSDL 等后继者(具有特定用途)
  • 字节、Protobuf 等
  • Yaml
  • ...
  • ...
  • 您自己的格式(您可以创建自己的序列化格式并使用它,但这是一件大事,大多数时候不值得)

【讨论】:

  • 如何将内存中的对象引用发送到其他计算机或保存到磁盘而不进行序列化?在我看来,这不仅更难,而且不可能。
  • 在很多情况下,我认为序列化的很大一部分原因在于它与语言无关。当您选择序列化方法时,您不是在选择一种语言,而是在选择 两点之间支持的表示,这可能是从母语翻译或翻译成母语的相同或不同语言结构。
  • XML 有 SOAP、WSDL 等前辈 - 这个说法是错误的。 SOAP 和 WSDL 不是 XML 的前身。 WSDL XML,而 SOAP 是一种在系统之间描述和调用对象的手段。 XML 的存在时间也比其中任何一个都长,它是数据描述的基本语法。
  • 致 Esailija:有时候,问题的关键不是难度,而是效率。例如,如果您只需要发送 Person 类对象的 Name、Surname 和 Credentials,直到您每周发送一次 - 您将感觉不到它。但是您是否应该每秒发送一次……安全性呢?如果您序列化整个对象并在没有加密的情况下无线发送它,人们可能会扫描它并获取社会安全号码、银行信息等......所以在这种情况下,我确实认为序列化不是一种选择。
  • 致 Jared Farrish:我的错。应该有词后继者,而不是前任者。已经编辑了:)
【解决方案2】:

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

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

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

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

【讨论】:

  • 这意味着我可以以任何我想要的方式序列化数据,但它应该被列为一系列块,所以我们可以将数组称为序列化数据?!
  • 不完全是。数组不是序列化数据。数组存在于内存中。它们是对象。一旦您使用某种格式对它们进行序列化,它们就会被转换为可以通过网络保存或发送的某种字节表示。确切的表示将取决于您选择的序列化格式。
  • @DarinDimitrov 谢谢你的评论,让我看看你的答案并学到了一些东西;-)
  • 这应该是公认的答案,另一个有未解决的争议:P
  • 这个答案也很好,但我觉得我选择的答案更清晰直接。
【解决方案3】:

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

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

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

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

$dataString = serialize($blub);

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

【讨论】:

    【解决方案4】:

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

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

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

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

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

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

    【讨论】:

    • 我对培训考试结果做了同样的事情。我将问题和答案与记录一起存储在行中,以便以后更新问题时,仍然保留考试内容。当然,它本可以更完整地描述和设计,但实际上并没有必要,因此将其序列化是一个完美的折衷方案,并且已经持续了 5 年以上。
    【解决方案5】:

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

    这里是 jQueryprototype.JS 等效项的参考。

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

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

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

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

    【讨论】:

    • 不知道是不是严格意义上的序列化
    • @Said Bakr:我想说的用法比语言更重要。定义总是一样的。这一切都归结为将数据从 A 传递到 B,以便可以检索和解构。
    猜你喜欢
    • 2011-01-30
    • 2017-11-30
    • 2010-10-12
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    相关资源
    最近更新 更多