PHP 的 serialize() 函数是干啥用的?
Posted
技术标签:
【中文标题】PHP 的 serialize() 函数是干啥用的?【英文标题】:What is PHP's serialize() function for?PHP 的 serialize() 函数是干什么用的? 【发布时间】:2010-11-13 21:57:58 【问题描述】:我刚刚了解了serialize()
和unserialize()
函数。这有什么用途?我知道人们将事物序列化以放入数据库。你能给我一些有用的例子吗?
我也看到 javascript 中的序列化代码,是一样的吗? javascript中的序列化字符串可以用phpunserialize()
反序列化吗?
【问题讨论】:
【参考方案1】:PHP 序列化允许您以文本形式保存数组或对象。将数组分配给 $_SESSION 之类的东西时,它允许 PHP 将其存储在文本文件中,然后再重新创建它。序列化像这样用于对象和变量。 (只要确保你事先声明了对象使用的类)
另一方面,Wordpress 将其用于非常相似的方法,将序列化的数组直接存储在数据库中。如果您保留一个键 => 值的数据库,由于数组的灵活性,这可能非常有益,您可以在 value 参数中存储任何内容。
这是链接(由第一位评论者提供):http://us3.php.net/serialize
【讨论】:
你刚才说你要以文本形式保存一个数组,这是错误的。您可以序列化任何类型的变量。你甚至可以序列化一个对象。当您反序列化一个对象时,您唯一需要考虑的是拥有您将反序列化的对象的声明 顺便说一句,在段落的末尾我最初说它用于对象和数组。【参考方案2】:我经常在数据库中看到序列化的数据存储,我真的不喜欢这样:
在 SQL 中处理这些数据真的很困难:你如何在序列化数据上编写条件?更难的是:你如何更新它?您是否真的编写了一个 PHP 脚本来获取每一行、反序列化、修改它们、重新序列化并将它们存储回 DB 中? :-( 在您想要将数据迁移到另一个软件的那一天,迁移数据需要做更多的工作(如果新软件不是用 PHP 编写的,那么工作量会更大,顺便说一句)不过,我承认这是一种存储未明确定义的数据的简单方法...而且我有时确实会使用它...
序列化的另一个用途是促进两个系统之间的数据交换:例如,通过某种 web 服务发送对象,要求它们以某种方式序列化。
如果两个系统都是 PHP,你可以设想使用serialize
/unserialize
。但是,在这里,如果其中一个系统不再是 PHP 怎么办?使用 JSON 或 SOAP 可能是更好的选择:一开始会有点困难,但可能是更长期的解决方案,因为这些格式在其他语言中也是已知的。
我使用 PHP 的 serialize
函数的一件事是将数据存储在缓存中(就像 APC 的用户缓存),在 PHP 应用程序中:您不能按原样存储对象:您必须序列化它们.由于缓存仅由一个应用程序使用,因此不必使用多种语言都知道的格式;所以,序列化是可以的......而且,要将数据存储在缓存中,你应该使用一个非常快速的序列化函数 - 序列化非常快^^
【讨论】:
很棒的评论帕斯卡!如果大家有兴趣,还有这个很棒的post 比较json_encode和serialize。【参考方案3】:我经常使用serialize
将重要信息存储在数据库中,这些信息不值得为其创建一个全新的字段,但将来可能会用到。
例如,如果用户填写了一个我只存储了其中几个元素的表单,但我想保留它们以备不时之需,我将序列化表单元素数组并将其存储在数据库。
【讨论】:
是的,这通常是我使用它的方式。特别是如果您有未知数量的 key=>val 对(具有未知名称),则很难构建一个好的数据库结构来处理它。 @Christian:看EAV模式。将这类数据规范化到数据库中一点也不难,实际上要灵活得多。 我开始为此使用 json。允许您以 更多 标准格式保存数据,而不是 php 序列化 @Nelson:很有趣,将更深入地研究 EAV 模式。谢谢你告诉我!【参考方案4】:当您想在 PHP 之外传递数据时使用序列化,例如传递给 Javascript。
是的,它通常可以按原样发送字符串、整数和字符串,但不能像数组这样更复杂的结构。阅读有关将 PHP 数组传递给 Javascript here 的更多信息。
您还可以将数据格式化为多种语言广泛支持的 JSON,但是在转换为它时会丢失 PHP 原生类型和您自己的类。阅读有关 JSON 和 PHP 的更多信息here。
【讨论】:
您开始回答序列化用于将 php 之外的数据传递给例如的信息。 js,但是如果你的目标不再是 php,那么保留原生 php 类型的目的是什么? 好评!没错,如果您的目标不再是 php,那么它可能不支持 PHP 本机类型。但是您的中间步骤(目标)可以是将数据存储在数据库中,然后在 PHP 中再次使用它。以上是关于PHP 的 serialize() 函数是干啥用的?的主要内容,如果未能解决你的问题,请参考以下文章