72

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

4

11 に答える 11

95
  1. JSONエンコード()&デコード()
    • PHPバージョン>=5.0.0
      • ネスト制限は20です。
    • PHPバージョン>=5.2.3
      • ネスト制限は128です。
    • PHPバージョン>=5.3.0
      • 512のネスト制限。
    • フットプリントが小さいのに対し、PHPのシリアル化された文字列。
  2. シリアル化( )&非シリアル化()
    • PHPバージョン>=4.0.0
      • PHPデータ型オブジェクトでメソッドが失われることはありません。
      • __wakeup()マジックメソッドは、シリアル化されていないオブジェクトに対して呼び出されます。(とてもパワフルな)
      • 一部の空白文字の処理に問題があるため、 base64エンコード文字列をデータベースに入れ、base64デコード文字列をこの関数でデータベースから取り出すのが最適な場合があることに注意してください。

選択はあなた次第です。

于 2009-11-12T10:02:23.337 に答える
87

プロJSON:

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

Proシリアル化アレイ:

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

コメントが示すように、JSONはシリアル化配列よりも少ないスペースを占有します。また、JSONとシリアル化のどちらが高速かを確認しました。驚くべきことに、シリアル化よりもJSONエンコードの方が高速です。ただし、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>
于 2009-08-20T15:00:02.897 に答える
30

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

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

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

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

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

結論:PHPシリアル化を使用するやむを得ない理由がない限り、JSONを使用してください。

于 2009-08-20T15:12:47.057 に答える
7

JSONはより移植性が高く、さまざまな言語などからより簡単に読み取り/書き込みできます。PHPシリアル化配列を使用した場合は、PHPを使用して簡単にアクセスすることしかできません。

于 2009-08-20T14:58:32.383 に答える
7

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

プロアレイ

  • シリアル化を使用したセッション:json_encode / decodeよりも高速だと思います(よくわかりません)
  • PHPの配列に関する多くの関数(ソート/マージ/ ...)

プロJSON

  • JSONは他の言語やWeb言語で知られています
  • データベースの冗長性が少ない
  • XMLのような多くのツール:JSON SChema
于 2009-08-20T15:15:14.573 に答える
4

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

PHP配列を保存するための推奨される方法(json_encodeとserialize)

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

于 2009-08-20T15:02:02.333 に答える
3

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

于 2012-06-08T23:36:58.107 に答える
2

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

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

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

于 2011-11-16T23:39:12.973 に答える
2

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

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

于 2013-02-07T11:53:13.030 に答える
1

phpserializeでこの大きな問題が発生しました。unserializeを使用して読み取る単一のフィールドに多くのデータを格納しました。

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

だから私のポイントはシリアル化を避けることです。JSONを使用すると、はるかに安全になり、将来の主要な問題に頭を悩ませることはありません。

私にとっては、これ以上シリアル化する必要はありません。

于 2013-01-16T19:47:12.707 に答える
-5

atm、json_encode()は、UTF-8でエンコードされたデータでのみ機能します。したがって、「ñ」などの文字をエンコードすることはできません。それ以外の場合は、NULLを返します。

于 2010-02-07T01:30:17.667 に答える