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

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

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

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

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

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

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

PHP – serialize() シリアライズ

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

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

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

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

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

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

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

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

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

<?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() デシリアライズ

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

<?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 ) 

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

$arr = serialize($arr);
// データ保存

// データ読み込み
$arr = unserialize(データ);

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

jQueryAPI serialize()

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

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

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

<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>
$(function() {
	$(":submit").click(function() {
		alert($("form").serialize());
	});
});

結果: name=&email=&message=

おまけ – WordPressの例

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

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