PHP中的Serialize或json?

时间:2010-04-04 14:35:21

标签: php json serialization

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

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

6 个答案:

答案 0 :(得分:49)

serialize的主要优点:它特定于PHP,这意味着它可以代表PHP类型,包括你自己的类的实例 - 你会得到你的对象,仍然反序列化数据时类的实例。


json_encode的主要优点:JSON并不特定于PHP:有多种库可以用多种语言读/写它 - 这意味着如果你想要一些可以用另一种语言操作比PHP。

JSON字符串也比手动

更易于手动读取/写入/修改

另一方面,由于JSON不是特定于PHP的,因此它不知道特定于PHP的东西 - 比如数据类型。


作为几个旁注:

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

答案 1 :(得分:11)

我在PHP中对Json编码与序列化进行了一些分析。我发现Json最适合普通和简单的数据,如数组。

https://www.shozab.com/php-serialization-vs-json-encoding-for-an-array/

查看我的实验结果

答案 2 :(得分:6)

json_encode优于serialize的另一个优势是尺寸。我注意到,当我试图弄清楚为什么我们memcache使用的内存变得如此之大,并且试图找到减少的方法是:

<?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%。

答案 3 :(得分:5)

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

如果出现这种情况,请仔细考虑。

至于差异。 PHP序列化可能更紧凑,但只能与PHP一起使用。 JSON是跨平台的,编码和解码速度可能较慢(尽管我有点怀疑)。

答案 4 :(得分:3)

首先,感谢Shozab Hasan和user359650进行这些测试。我想知道哪个选择是最好的,现在我知道了:

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

要对PHP对象进行编码,serialize是一个更好的选择,因为PHP对象的特殊性只能通过PHP实现。

要存储数据,可以将编码数据存储在文件中,也可以使用标准格式的MySQL。恢复数据要容易得多。 MySQL具有很强的功能,可以按照您希望的方式获取数据而无需PHP处理。

我从未进行过任何测试,但我认为如果系统文件排序足以按字母/数字顺序取回文件,文件存储是存储数据的最佳方式。 MySQL对这种处理贪婪并使用文件系统......

答案 5 :(得分:2)

如果您的数据永远不会离开您的PHP应用程序,我建议使用serialize(),因为它为您的对象提供了许多额外的功能,如__sleep()和__wakeup()方法。它还将对象恢复为正确类的实例。

如果要将序列化数据传递给另一个应用程序,则应使用JSON或XML进行兼容。

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