ネクストベータ代表Blog

WEBシステム SI屋の代表のブログです。

*

シリアライズの目的・意味

   

シリアライズ関係のコードを書いたことが無かったので目的や意味がイマイチわかりませんでした。
以下のサイトを見つけてなるほどと思い、引用させて頂きました。

以下引用

覚えておきたい「シリアライズ serialize」

シリアライズとは、ソフトウェア内部で扱っているデータをそのまま、保存したり送受信することができるように変換することです。

データベースに配列データをそのまま保存したい時などに使います。

通常、データベースには「フィールド:値」という形式で保存される為、配列データをそのまま保存することはできません。
仮に「array(‘a’, ‘b’, ‘c’)」という値を保存したとしても、それはただの 文字列 にすぎません。
一方、シリアライズすると、配列データを配列データとして保存することができます。

特に、配列の要素数や構造が動的に変化するデータを取り扱う場合には、必ずと言っていいほど使うでしょう。

では、シリアライズによって、データがどのように変換されるかを見ていきます。

まずはPHPのシリアライズから。

PHP – serialize() シリアライズ

シリアライズ後の文字列は「型:値」の形式に変換されます。

1
2
<?php echo serialize(100); ?>
結果: i:100;

整数型(integer)は「i」です。

1
2
<?php echo serialize("hijiri"); ?>
結果: s:6:"hijiri";

文字列型(string)は「s」です。
その後に付いている「6」という数字はバイト数です。

1
2
<?php echo serialize(true); ?>
結果: b:1;

論理型(boolean)は「b」です。
true:1, false:0

1
2
<?php echo serialize(null); ?>
結果: N;

ヌル型(null)は「N」です。

1
2
3
4
5
6
7
8
9
<?php echo serialize(array(1,2,3)); ?>
結果: a:3:{i:0;i:1;i:1;i:2;i:2;i:3;}
<?php echo serialize(array("a","b")); ?>
結果: a:2:{i:0;s:1:"a";i:1;s:1:"b";}
<?php echo serialize(array("a"=>123, "b"=>456)); ?>
結果: a:2:{s:1:"a";i:123;s:1:"b";i:456;}
?>

配列型(array)は「a」です。
その後に要素数が付きます。「a:要素数:{}」
{}内には、配列の要素のキーと値が、それぞれシリアライズ変換されて並びます。「キー;値;」

もうシリアライズ変換された文字列は読めますよね?

PHP – unserialize() デシリアライズ

シリアライズで変換された文字列を、元のデータに戻してみます。

1
2
3
4
5
6
7
8
<?php print_r(unserialize('a:3:{i:0;i:1;i:1;i:2;i:2;i:3;}')); ?>
結果: Array ( [0] => 1 [1] => 2 [2] => 3 )
<?php print_r(unserialize('a:2:{i:0;s:1:"a";i:1;s:1:"b";}')); ?>
結果: Array ( [0] => a [1] => b )
<?php print_r(unserialize('a:2:{s:1:"a";i:123;s:1:"b";i:456;}')) ?>
結果: Array ( [a] => 123 [b] => 456 )

実際には以下のような流れになるので、シリアライズ変換された文字列を意識することはありません。

1
2
3
4
5
$arr = serialize($arr);
// データ保存
// データ読み込み
$arr = unserialize(データ);

※シリアライズデータを取り扱う場合は、適切なエスケープ処理もお忘れなく。

jQueryAPI serialize()

シリアライズは javascript でも使えます。

jQueryでは標準でシリアライズ関数が用意されています。

以下の例では、サブミットするとフォームの内容が、すべてシリアライズ文字列として返されます。

1
2
3
4
5
6
7
8
9
10
11
<form>
    <dl>
        <dt>name:</dt>
        <dd><input type="text" name="name" /></dd>
        <dt>email:</dt>
        <dd><input type="text" name="email" /></dd>
        <dt>message:</dt>
        <dd><textarea name="message"></textarea></dd>
    </dl>
    <input type="submit" value="submit" />
</form>
1
2
3
4
5
$(function() {
    $(":submit").click(function() {
        alert($("form").serialize());
    });
});

結果: name=&email=&message=

おまけ – WordPressの例

WordPressデータベースの wp_options テーブルには、アクティブなプラグインの設定値や、アクティブなテーマの設定値が保存されています。これらの値はすべてシリアライズされています。

また、多くのWordPressのプラグインは、wp_options テーブルに、固有の設定値を保存する機構になっており、設定値を保存する関数 update_option() を使うと、自動的にシリアライズして保存されるようになっています。

▼外部リンク

覚えておきたい「シリアライズ – serialize」 | hijiriworld web:

 - コラム