所以我需要在PHP中对数组进行编码并将其以纯文本形式存储在MySQL数据库中,我的问题是我应该使用serialize()还是json_encode()?每个人的优点和缺点是什么?
我认为他们中的任何一个都会在这种情况下做。但是你更喜欢哪一个?为什么?如果它不是数组?
答案 0 :(得分:49)
serialize
的主要优点:它特定于PHP,这意味着它可以代表PHP类型,包括你自己的类的实例 - 你会得到你的对象,仍然反序列化数据时类的实例。
json_encode
的主要优点:JSON并不特定于PHP:有多种库可以用多种语言读/写它 - 这意味着如果你想要一些可以用另一种语言操作比PHP。
JSON字符串也比手动
更易于手动读取/写入/修改 。另一方面,由于JSON不是特定于PHP的,因此它不知道特定于PHP的东西 - 比如数据类型。
作为几个旁注:
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存储到数据库中?也许你应该再考虑一下。以后可能会遇到麻烦。