为什么WordPress会选择通过json_encode进行数据序列化?


13

在我使用WordPress的小时代,我已经看到WordPress本身及其友好的插件serialize()在许多情况下都使用PHP 将数据存储到db中。但在最近的搜索,我发现了一个严重的社会支持json_encode()serialize()

我亲自测试了两个'em'的关联数组,结果表明:

  • serialize() 存放342个字符
  • json_encode() 储存285个字符

为什么我要问这个?

我在一个项目中,同时将重复的元字段存储到帖子中。哪里:

  • 数据基本上是英文的,但有时可能是孟加拉语
  • 数据将是3层深度的关联数组(我希望我正确理解了水平):
array(
    1 => array(
        'key'=>'value',
        'key2'=>'value'
    ),
    2 => array(
        'key'=>'value',
        'key2'=>'value'
    )
)

我已经检查了postmeta表的meta_value字段是a longtext这意味着长度为4,294,967,295个字符(4GB)。

因此,我需要一个可靠的解决方案来存储事物。


一句话,遗产。WordPress的早广泛采用JSON,作为结果,吨网站取决于API,所以它在这里混淆新开发谁不读,它的过时....
内特Symer

Answers:


13

我认为,不是100%确定这是WP开发人员采用此方法的真正原因,但是常识告诉我,序列化保留变量类型并具有内置的小型错误检测功能,而json仅存储字符串值{ key : value },所以当您回到PHP,您将不得不猜测格式,或者为其创建解析器。这将迫使您有两种不同的方式来处理数据:以前,将数据存储为json,并且在解码json之后,它将作为完全不同的对象返回。

这是大小不同的主要原因,PHP不仅存储数组;还存储了数组。它存储了序列化数组时数组中有多少个元素,它们的类型和值。

您不仅要在数据库上存储键值对,还可能要存储具有不同变量类型的对象。


我最喜欢这个答案。真的很有帮助。
Mayeenul Islam 2015年

1
从根本上说,与使用JSON进行更简单的序列化相比,使用海化数据在此答案中听起来是肯定的,但这只会使其变得更加复杂(且不安全)。只是说。另一个原因给出了实际原因,即引入该功能的时间,只有PHP序列化功能,而JSON还不存在。
hakre

6

JSON编码是在PHP 5.2中引入的,WordPress较老,并且它是为PHP 4诞生(并设计的)。

数据序列化在WordPress中无处不在,因此从PHP序列化转向JSON编码将意味着巨大的向后兼容性问题,如果我对WordPress有所了解,那将永远不会发生。

就是说,如果您认为JSON编码比PHP序列化更适合您,请使用它。

如果您传递一个字符串(即数据的JSON编码版本)以发布元函数,WordPress将不会触摸它,但是您需要记住在检索时对数据进行JSON解码。

如果数据库存储大小对您来说非常重要,那么它可能值得进行其他工作,否则,请让WordPress使用它的用途,而不管它。

也许,您可以评估是否使用自定义表来保存数据。


3

我倾向于以“服从意见”的态度来结束这个问题,但是我认为这个问题有两个很好的答案。我将继续学习“历史”。

1)json_encode在PHP核心中相对较新。

json_encode

(PHP 5> = 5.2.0,PECL json> = 1.2.0)json_encode —返回值的JSON表示形式

http://php.net/manual/zh/function.json-encode.php

json_encode在WordPress的早期就不可靠。尽管它早在PECL扩展中就可以使用了,但它仅在5.2中引入了“核心” PHP。

其次,如果您将一个对象(例如WP_Query对象)输入,json_encode则会得到stdClass对象json_decodeserialize/ unserialize将保留对象。


+1。但是我反对“服从意见”,因为我附有证明。最后一个:与类相关的问题:我已经在第二个链接中提到了(原因为何不使用json_encode)。
Mayeenul Islam 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.