web-dev-qa-db-ja.com

JSONとデータベースのシリアル化された配列

JSONデータをMySQLデータベースに保存することと、シリアル化された配列の利点と欠点は何ですか?

70
Inez
  1. JSON エンコード ()& デコード ()
    • PHPバージョン> = 5.0.0
      • 20のネスト制限。
    • PHPバージョン> = 5.2.3
      • 128のネスト制限。
    • PHPバージョン> = 5.3.0
      • 512のネスト制限。
    • 小さなフットプリントとPHPのシリアル化された文字列。
  2. serialize ()& nserialize ()
    • PHPバージョン> = 4.0.0
      • メソッドはPHP Datatype Object。
      • __wakeup()マジックメソッドは、非シリアル化されるオブジェクトで呼び出されます。 (とてもパワフルな)
      • base64エンコード データベースに入力される文字列、および base64デコード この関数を使用してデータベースから取り出される文字列は、一部の空白文字の処理に関する問題。

選択はあなた次第です。

93
Mark Tomlin

プロJSON:

  • JSONデータは、PHPだけでなく、さまざまな言語で使用できます。
  • JSONデータは人間が読み取りおよび書き込み可能です。
  • 必要なスペースが少ない
  • シリアル化するよりもJSONをエンコードする方が高速です

Pro Serialized Array:

  • JSONデコードよりも非シリアル化の方が高速です

コメントが示すように、JSONはシリアル化配列よりも少ないスペースを使用します。また、JSONまたはSerializingの方が高速かどうかも確認しました。驚くべきことに、JSONエンコードの方がSerializeよりも高速です。ただし、JSONデコードよりもシリアライズ解除の方が高速です。

これは、テストに使用したスクリプトです。

<?php 
function runTime(){
      $mtime = microtime(); 
      $mtime = explode(' ', $mtime); 
      $mtime = $mtime[1] + $mtime[0]; 
      return $mtime; 
}
?> 
<pre>
<?php
$start = runTime();

$ser;

for($i=0; $i<1000; $i++){
    $a = array(a => 1, x => 10);
    $ser = serialize($a);
}
$total = runTime() - $start;
echo "Serializing 1000 times took \t$total seconds";
?>

<?php
$start = runTime();

$json;

for($i=0; $i<1000; $i++){
    $a = array(a => 1, x => 10);
    $json = json_encode($a);
}
$total = runTime() - $start;
echo "JSON encoding 1000 times took \t$total seconds";
?>

<?php
$start = runTime();

$ser;

for($i=0; $i<1000; $i++){
    $a = unserialize($ser);
}
$total = runTime() - $start;
echo "Unserializing 1000 times took \t$total seconds";
?>

<?php
$start = runTime();

$json;

for($i=0; $i<1000; $i++){
    $a = json_decode($json);
}
$total = runTime() - $start;
echo "JSON decoding 1000 times took \t$total seconds";
?>
</pre>
84
Marius

移植性:勝者JSON。 JSONはさまざまなプラットフォームでサポートされていますが、PHP逆シリアル化は(私の知る限り)PHPでのみサポートされています。どの言語でもどちらの形式でも解析できますが、JSONには事前に構築されたライブラリがあります。

将来の証明:勝者JSON。 JSONはJavascriptが標準であるという意味で「標準」であり、将来変更される可能性はほとんどありません。 PHPグループは、シリアル化形式の将来について約束していません。将来変更されることはほとんどありませんが、単一のグループが形式を制御するという事実は、読みにくい将来のデータになる可能性があることを意味します。

忠実度:受賞者PHP。 PHPシリアル化により、カスタムクラスで定義されたオブジェクトを含むネイティブPHPデータ型でデータを保存できます。 JSONでは、一般的なプリミティブ型、プリミティブ型のリスト(「配列」)、およびキー/値ペアオブジェクトのみを保存できます。 PHP PHPアプリケーションを開発している場合、シリアル化にはいくつかの利点があります。

ファイルサイズ:PHPの現在のシリアル化形式は(より多くの情報を保存しているので)より冗長であるため、JSONはここでわずかに勝ちます。

パフォーマンス:誰が知っているか、それはプロファイルに依存します。

結論:PHP Serializationを使用する説得力のある理由がない限り、JSONを使用してください。

29
Alan Storm

JSONはより移植性があります。つまり、異なる言語などからより簡単に読み書きできます。PHP直列化された配列を使用した場合、PHPアクセスします。

7
Tom Haigh

PHP?のみでデータを使用していますか?はいの場合:配列、いいえの場合:JSON。

プロアレイ

  • セッションはシリアル化を使用しました:json_encode/decodeよりも高速だと思います(確かではありません)
  • PHP(sorting/merging/...)の配列の多くの関数

プロJSON

  • JSONは他の言語およびWeb言語で認識されています
  • データベースの冗長さを軽減
  • xMLなどの多くのツール:JSON SChema
7
mere-teresa

SOにはこのような質問がたくさんありました。

保存する優先メソッドPHP配列(json_encode vs serialize)

つまり、JSONは単純なデータには適していますが、オブジェクトと連想配列の違いを区別しません。シリアル化されたデータは大きくなります。

4
Thinker

配列およびJavascriptまたは他の言語との通信にjsonを使用します。オブジェクトに対してシリアル化を使用するか、現在実行中のスクリプトに対して内部のPHP workを使用します。

3
laurens

ほとんどの回答がすでに指摘しているように、JSONはシリアル化に勝っています。最大の利点はプラットフォームの独立性だと思います。他のアプリケーションがデータベースと通信し、PHPとは何の関係もない場合があります。

ただし、bothソリューションはデータベースの正規化に違反します。データベースは 最初の標準形式 にならないため、検索などのデータベース機能を利用できません。より良いアプローチは、 オブジェクトリレーショナルマッピング を使用することです。そこには良いライブラリがあります-例えば doctrine ORM を検討してください。

2

jSON.stringify(obj)で引用符や特殊文字を回避しようとする場合、データベース固有のエスケープメソッドを使用してPHPで行うことができます。

<?php
mysql_real_escape_string(htmlspecialchars($value))
?>

これを安全に保存し、読み戻すときにデコードできるようになりました

2
tim

php serializeでこの大きな問題が発生しました。 nserializeを使用して単一のフィールドに大量のデータを保存しました。

起こったのは、そのフィールドでいくつかの破損したデータを得たことです。 「a」、「s」、「N」などのコードでデータをシリアル化してマップします。破損したデータがある場合、マップは失敗しました。バイトコードエラーが原因でunserialize関数が機能しないというphpエラーが表示されます。

したがって、私のポイントはserializeを避けることです。 [〜#〜] json [〜#〜]を使用すると、より安全になり、将来の主要な問題に頭を痛めることはありません。

私にとっては、これ以上serializeはありません。