代码之家  ›  专栏  ›  技术社区  ›  datasn.io

在PHP中序列化还是JSON?

  •  45
  • datasn.io  · 技术社区  · 15 年前

    所以我需要用php对数组进行编码,并将其以纯文本形式存储在mysql数据库中,我的问题是应该使用serialize()还是json_encode()?它们各自的优缺点是什么?

    我想他们中的任何一个都会在这种情况下做。但是你更喜欢哪一个,为什么?是否用于数组以外的其他对象?

    6 回复  |  直到 6 年前
        1
  •  49
  •   Pascal MARTIN    15 年前

    主要优势 serialize :它特定于PHP,这意味着 它可以表示PHP类型 ,包括您自己的类的实例——当取消数据的序列化时,您将返回对象,仍然是类的实例。


    主要优势 json_encode :json并不是特定于php的:有一些库可以用几种语言读/写它——这意味着如果您想要一些 可以用另一种语言操纵 比PHP。

    JSON字符串也更容易读/写/修改 用手 而不是序列化的。

    另一方面,由于JSON不是特定于PHP的,所以它不知道特定于PHP的内容——比如数据类型。


    作为一对旁注:

    • 即使这两者之间的速度差别很小,也不太重要:您可能不会序列化/取消序列化大量数据。
    • 您确定这是在数据库中存储数据的最佳方法吗?
      • 在数据库中,您将无法对序列化strin执行太多查询:您将无法在 where 子句,也不能在没有php干预的情况下更新它…
        2
  •  11
  •   Shozab Hasan    7 年前

    我在PHP中对JSON编码和序列化做了一些分析。我发现JSON最适合于简单明了的数据,比如数组。

    我的实验结果见 https://www.shozab.com/php-serialization-vs-json-encoding-for-an-array/

        3
  •  6
  •   Max    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%。

        4
  •  5
  •   cletus    15 年前

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

    所以,如果这是那种情况,请仔细考虑。

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

        5
  •  3
  •   Vidda    12 年前

    首先,感谢Shozab Hasan和用户359650的测试。我想知道哪种选择是最好的,现在我知道了:

    要编码一个简单的数组,json可以同时使用php和javascript,也可以使用其他语言。

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

    要存储数据,要么将编码的数据存储在文件中,要么使用标准格式的MySQL。把你的数据拿回来会容易得多。MySQL有很好的功能,可以像不使用PHP处理的情况下那样获取数据。

    我从未做过任何测试,但我认为如果系统文件排序足以按字母/数字顺序返回文件,那么文件存储是存储数据的最佳方法。 MySQL对这种处理很贪婪,也使用了文件系统…

        6
  •  2
  •   selfawaresoup    15 年前

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

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

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

    推荐文章