PHP シリアライズとアンシリアライズ

目次

シリアライズとアンシリアライズとは

PHP の シリアライズ (serialize) と アンシリアライズ (unserialize) は、データを保存・転送しやすい形に変換したり、元に戻したりする仕組みです。

1. シリアライズ(serialize)の意味

複雑なデータ(配列やオブジェクトなど)を 文字列に変換 すること。
これにより、ファイル保存・DB保存・セッション保存・ネットワーク転送が可能になります。

2. アンシリアライズ(unserialize)の意味

シリアライズした文字列を 元の配列やオブジェクトに戻す こと。

よく使われる場面

セッション保存
PHPは内部的にセッション変数をファイルに書き出すとき、自動でシリアライズして保存します。

データベース保存
配列やオブジェクトをそのまま保存できないとき、シリアライズして文字列化する。

キャッシュ
一時的にデータを保存しておき、後でunserializeで復元する。

注意点

セキュリティリスク
unserialize() は任意のオブジェクトを復元できるため、不正データを渡されると オブジェクトインジェクション攻撃 の危険があります。
⇒ 安全な場合は json_encode() / json_decode() の方が推奨されることが多いです。

呼び方

JavaやPythonではデシリアライズ(deserialize)と呼ばれています。

シリアライズする

serialize ( mixed $value ) : string

シリアライズは、型や構造を持った状態で保存可能な値を生成します。

シリアライズするサンプルです。

<?php
# 文字列
$str1 = "test";
$disp1 = serialize($str1);
echo $disp1; # s:4:"test";

# 数値
$num1 = 100;
$disp2 = serialize($num1);
echo $disp2; # i:100;

# 配列
$col1 = [];
$col1[0] = "赤";
$col1[1] = "黄";
$disp3 = serialize($col1);
echo $disp3; # a:2:{i:0;s:3:"赤";i:1;s:3:"黄";}
?>

4行目は、文字列をシリアライズしています。
5行目のsは文字列で、4はバイト数です。
9行目は、数値をシリアライズしています。
10行目のiは数値です。
16行目は、配列をシリアライズしています。
17行目のaは配列で2は要素数です。

アンシリアライズする

unserialize ( string $str [, array $options ] ) : mixed

シリアライズされた値をもとに戻します。
アンシリアライズするときセキュリティのリスクがあるので注意して下さい。

アンシリアライズするサンプルです。

<?php

$disp1 = unserialize('s:4:"test";');
print_r($disp1); # test

$disp2 = unserialize(html_entity_decode('i:100;'));
print_r($disp2); # 100

$disp3 = unserialize('a:2:{i:0;s:3:"赤";i:1;s:3:"黄";}');
print_r($disp3); # Array ( [0] => 赤 [1] => 黄 )
?>

3行目は、文字列をアンシリアライズしています。
6行目は、数値をアンシリアライズしています。
9行目は、配列をアンシリアライズしています。

関連の記事

PHP 配列の仕組みと使い方

△上に戻る