WordPressがjson_encodeよりもデータのシリアル化を選択する理由


13

私がWordPressで過ごした小さな時代に、WordPress自体とそのフレンドリーなプラグインがPHP serialize()を使用してデータをdbに保存しているのを見てきました。しかし、最近の検索で私は深刻なコミュニティのサポート見つかっjson_encode()オーバーserialize()

そして私は個人的に両方の連想配列をテストしました:

  • serialize() 342文字を保存
  • json_encode() 285文字を保存

なぜ私はこれを求めているのですか?

繰り返しメタフィールドを投稿に保存する間、私はプロジェクトに参加しています。どこ:

  • データは基本的に英語ですが、ベンガル語の場合もあります
  • データは、3レベルの深さの連想配列になります(レベルを正しく理解したことを願っています)。
array(
    1 => array(
        'key'=>'value',
        'key2'=>'value'
    ),
    2 => array(
        'key'=>'value',
        'key2'=>'value'
    )
)

postmetaテーブルのmeta_valueフィールドをチェックしましたlongtextこれは、4,294,967,295文字(4GB)の長さを意味します。

だから物を保管するための堅牢なソリューションが必要です。


一言で言えば、レガシー。WordPressは広範なJSONの採用に先行し、それはそれは非推奨だと読んでいない新しい開発者を混乱させるためにここですので、結果として、サイトのトンは、APIに依存して....
ネイトSymer

回答:


13

これがWP開発者がこのアプローチを採用した本当の理由であると100%確信していないと思いますが、常識的には、シリアライズは変数タイプを保持し、エラー検出にミニが組み込まれ、jsonは文字列値のみを保存することを教えてくれ{ key : value }ますPHPに戻って、フォーマットを推測するか、そのパーサーを作成する必要があります。これにより、データを処理する2つの異なる方法が必要になります。以前は、データをjsonとして保存する方法と、jsonをデコードした後、まったく異なるオブジェクトとして返されます。

これが、サイズの違いの主な理由です。PHPは配列だけでなく、シリアル化されたときに配列に含まれていた要素の数、型、および値を格納しています。

データベースにはキーと値のペアだけを保存するのではなく、異なる変数タイプのオブジェクトを保存することもできます。


答えが一番好きです。本当に役立つ点。
Mayeenulイスラム

1
現実には、この回答で海水処理されたデータで肯定的に聞こえるのは、JSONを使用した単純なシリアル化よりも複雑な(そして安全でない)だけです。ただ言って。実際の理由は、機能が導入されたとき、PHPシリアライズ機能のみがあり、JSONはまだ存在していなかったという他の回答にあるとおりです。
-hakre

6

JSONエンコーディングはPHP 5.2で導入され、WordPressはかなり古く、PHP 4で誕生(および設計)されました。

データのシリアル化はWordPressで広く普及しているため、PHPのシリアル化からJSONエンコーディングへの移行は、後方互換性に関する大きな問題を意味します。WordPressを少し知っていれば、それは起こりません。

とは言っても、PHPシリアル化よりもJSONエンコードの方が適していると思われる場合は、それを使用してください。

文字列(つまり、データのJSONエンコードバージョン)をメタ関数のポストに渡すと、WordPressはそれに触れませんが、取得時にデータをJSONデコードすることを覚えておく必要があります。

DBストレージサイズが非常に重要な場合は、おそらく追加の作業に値するでしょう。それ以外の場合は、WordPressが使用するものを使用し、気にしないでください。

たぶん、データを保存するためのカスタムテーブルの場合かどうかを評価できます。


3

私はこれを「意見の対象」として締めくくりたいと思っていますが、質問にはいくつかの良い答えがあると思います。私は「歴史」と一緒に行きます。

1)json_encodePHPコアでは比較的新しい。

json_encode

(PHP 5> = 5.2.0、PECL json> = 1.2.0)json_encode —値のJSON表現を返します

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

json_encodeWordPressの初期には信頼できなかったでしょう。5.2では "コア" PHPにロールインされましたが、それよりずっと前にPECL拡張機能として利用可能でした。

第二に、次のようなオブジェクトを養う場合WP_Queryにオブジェクトjson_encodeあなたが得るstdClass上のオブジェクトをjson_decodeserialize/ unserializeはオブジェクトを保持します。


+1。しかし、証拠に隣接しているため、「意見に従う」ことに反対します。最後の1つ:クラス関連の問題:2番目のリンクで既に説明しました(理由はjson_encodeでした)。
Mayeenulイスラム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.