序列化或JSON在PHP?

所以我需要在PHP中编码一个数组,并将其存储在MySQL数据库中的纯文本,我的问题是我应该使用serialize()或json_encode()? 他们每个人的优点和缺点是什么?

我认为他们中的任何一个都会在这种情况下做。 但是你更喜欢哪一个?为什么? 如果是数组以外的东西?

serialize主要优势:它特定于PHP,这意味着它可以表示PHPtypes ,包括自己的类的实例 – 并且在反序列化数据时,将返回对象,仍然是类的实例。

json_encode主要优点:JSON不是特定于PHP的:有些库以多种语言读/写,这意味着如果你想要一些可以用 PHP以外的另一种语言来操作的东西,那就更好了。

一个JSONstring比一个序列化的string更容易读/写/修改。

另一方面,由于JSON并不特定于PHP,因此它不知道PHP特有的东西,比如数据types。

作为一些附注:

  • 即使这两者之间的速度差别不大,也不应该太重要:您可能不会序列化/反序列化大量数据
  • 你确定这是将数据存储在数据库中的最佳方式吗?
    • 你将无法对序列化的string进行很多查询,在DB中:你将无法在where子句中使用你的数据,也不能在没有PHP的干预的情况下更新它。

我在PHP中对Json编码和序列化做了一些分析。 而且我发现Json最适合于像数组这样简单明了的数据。

http://blog.shozab.net/php-serialization-vs-json-encoding-for-an-array/查看我的实验结果;

那么首先序列化数组或对象并将其存储在数据库中通常是一种代码味道。 有时候,人们会把逗号分隔的列表放到一个列中,然后在后来发现他们需要查询时遇到各种各样的麻烦。

所以如果是这样的情况,请仔细想一想。

至于差异。 PHP序列化可能更紧凑,但只能用于PHP。 JSON是跨平台的,可能编码和解码速度较慢(尽pipe我怀疑这是有意义的)。

json_encodeserialize另一个优点是大小。 我注意到,当我试图找出为什么我们的memcache使用内存变得如此之大,并试图find减less的方法是:

 <?php $myarray = array(); $myarray["a"]="b"; $serialize=serialize($myarray); $json=json_encode($myarray); $serialize_size=strlen($serialize); $json_size=strlen($json); var_dump($serialize); var_dump($json); echo "Size of serialized array: $serialize_size\n"; echo "Size of json encoded array: $json_size\n"; echo "Serialize is " . round(($serialize_size-$json_size)/$serialize_size*100) . "% bigger\n"; 

哪个给你:

 string(22) "a:1:{s:1:"a";s:1:"b";}" string(9) "{"a":"b"}" Size of serialized array: 22 Size of json encoded array: 9 Serialize is 59% bigger 

显然我已经采取了最极端的例子,因为数组越短,序列化的开销越重要。 仍然从一个生产网站,我看到的序列化数组比他们的JSON等价物大20%。

首先,感谢Shozab Hasan和user359650进行这些testing。 我想知道哪个select是最好的,现在我知道:

要编码一个简单的数组,JSON可以同时使用PHP和JavaScript,也许是其他语言。

要编码一个PHP对象,序列化是一个更好的select,因为PHP对象的特殊性只能用PHP实现。

要存储数据,请将编码的数据存储在文件中,或使用标准格式的MySQL。 将数据返回将会容易得多。 MySQL具有很好的function,可以按照您希望在没有PHP处理的情况下获取数据。

我从来没有做过任何testing,但我认为如果系统文件sorting足以按字母/数字顺序取回文件,则文件存储是存储数据的最佳方式。 MySQL也是为了这种处理而贪婪使用文件系统…

如果你的数据永远不会离开你的PHP应用程序,我推荐serialize(),因为它为你的对象提供了很多额外的function,比如__sleep()和__wakeup()方法。 它还将对象恢复为正确类的实例。

如果您将序列化的数据传递给另一个应用程序,则应该使用JSON或XML来兼容。

但是将一个序列化的对象存储到数据库中? 也许你应该再考虑一下。 以后可能会很麻烦。