PHP Velho Oeste 2024

serialize

(PHP 4, PHP 5, PHP 7)

serialize값의 저장 표현을 생성

설명

string serialize ( mixed $value )

값의 저장 표현을 생성합니다.

이는 PHP 값을 저장하거나 전달할 때 자료형이나 구조를 잃어버리지 않게 합니다.

일렬화된 문자열을 다시 PHP 변수로 만드려면, unserialize()를 사용합니다.

인수

value

일렬화할 값. serialize()resource형을 제외한 모든 형을 다룹니다. 자기 자신을 참조하는 배열을 serialize()할 수도 있습니다. 배열/객체 안의 순환 참조도 일렬화하여 저장됩니다. 그 외의 다른 참조는 읽어버립니다.

객체를 일렬화할 때, 일렬화 전에 __sleep 멤버 함수를 호출합니다. 이로써 일렬화하기 전에 객체를 마지막으로 정리할 수 있습니다. 마찬가지로, unserialize()을 사용하여 객체를 되돌릴 때는 __wakeup 멤버 함수를 호출합니다.

Note:

객체의 private 멤버는 이름 앞에 클래스 이름을 덧붙입니다; protected 멤버는 이름 앞에 '*'를 덧붙입니다. 이런 덧붙인 값은 모두 null 바이트를 가집니다.

반환값

value의 어디에라도 저장할 수 있는 바이트 스트림 표현을 가지는 문자열을 반환합니다.

예제

Example #1 serialize() 예제

<?php
// $session_data는 현재 사용자의 세션 정보를 다차원 배열로
// 가집니다. 요청의 마지막에 이것을 데이터베이스에 저장하기
// 위해서 serialize()를 사용합니다.

$conn odbc_connect("webdb""php""chicken");
$stmt odbc_prepare($conn,
      
"UPDATE sessions SET data = ? WHERE id = ?");
$sqldata = array (serialize($session_data), $_SERVER['PHP_AUTH_USER']);
if (!
odbc_execute($stmt, &$sqldata)) {
    
$stmt odbc_prepare($conn,
     
"INSERT INTO sessions (id, data) VALUES(?, ?)");
    if (!
odbc_execute($stmt, &$sqldata)) {
        
/* 무언가 잘못되었을때 할 일.. */
    
}
}
?>

변경점

버전 설명
4.0.7 객체 일렬화 처리가 고정되었습니다.

주의

Note:

PHP 내부 객체를 일렬화할 수 없습니다.

참고

add a note add a note

User Contributed Notes 7 notes

up
352
egingell at sisna dot com
17 years ago
<?
/*
Anatomy of a serialize()'ed value:

String
s:size:value;

Integer
i:value;

Boolean
b:value; (does not store "true" or "false", does store '1' or '0')

Null
N;

Array
a:size:{key definition;value definition;(repeated per element)}

Object
O:strlen(object name):object name:object size:{s:strlen(property name):property name:property definition;(repeated per property)}

String values are always in double quotes
Array keys are always integers or strings
    "null => 'value'" equates to 's:0:"";s:5:"value";',
    "true => 'value'" equates to 'i:1;s:5:"value";',
    "false => 'value'" equates to 'i:0;s:5:"value";',
    "array(whatever the contents) => 'value'" equates to an "illegal offset type" warning because you can't use an
    array as a key; however, if you use a variable containing an array as a key, it will equate to 's:5:"Array";s:5:"value";',
     and
    attempting to use an object as a key will result in the same behavior as using an array will.
*/
?>
up
276
Anonymous
12 years ago
Please! please! please! DO NOT serialize data and place it into your database. Serialize can be used that way, but that's missing the point of a relational database and the datatypes inherent in your database engine. Doing this makes data in your database non-portable, difficult to read, and can complicate queries. If you want your application to be portable to other languages, like let's say you find that you want to use Java for some portion of your app that it makes sense to use Java in, serialization will become a pain in the buttocks. You should always be able to query and modify data in the database without using a third party intermediary tool to manipulate data to be inserted.

I've encountered this too many times in my career, it makes for difficult to maintain code, code with portability issues, and data that is it more difficult to migrate to other RDMS systems, new schema, etc. It also has the added disadvantage of making it messy to search your database based on one of the fields that you've serialized.

That's not to say serialize() is useless. It's not... A good place to use it may be a cache file that contains the result of a data intensive operation, for instance. There are tons of others... Just don't abuse serialize because the next guy who comes along will have a maintenance or migration nightmare.
up
20
MC_Gurk at gmx dot net
18 years ago
If you are going to serialie an object which contains references to other objects you want to serialize some time later, these references will be lost when the object is unserialized.
The references can only be kept if all of your objects are serialized at once.
That means:

$a = new ClassA();
$b = new ClassB($a); //$b containes a reference to $a;

$s1=serialize($a);
$s2=serialize($b);

$a=unserialize($s1);
$b=unserialize($s2);

now b references to an object of ClassA which is not $a. $a is another object of Class A.

use this:
$buf[0]=$a;
$buf[1]=$b;
$s=serialize($buf);
$buf=unserialize($s);
$a=$buf[0];
$b=$buf[1];

all references are intact.
up
27
nh at ngin dot de
11 years ago
Serializing floating point numbers leads to weird precision offset errors:

<?php

echo round(96.670000000000002, 2);
// 96.67

echo serialize(round(96.670000000000002, 2));
// d:96.670000000000002;

echo serialize(96.67);
// d:96.670000000000002;

?>

Not only is this wrong, but it adds a lot of unnecessary bulk to serialized data. Probably better to use json_encode() instead (which apparently is faster than serialize(), anyway).
up
11
frost at easycast dot ru
10 years ago
Closures cannot be serialized:
<?php
$func
= function () {echo 'hello!';};
$func(); // prints "hello!"

$result = serialize($func);  // Fatal error: Uncaught exception 'Exception' with message 'Serialization of 'Closure' is not allowed'
?>
up
7
Andrew B
11 years ago
When you serialize an array the internal pointer will not be preserved. Apparently this is the expected behavior but was a bit of a gotcha moment for me. Copy and paste example below.

<?php
//Internal Pointer will be 2 once variables have been assigned.
$array = array();
$array[] = 1;
$array[] = 2;
$array[] = 3;

//Unset variables. Internal pointer will still be at 2.    
unset($array[0]);
unset(
$array[1]);
unset(
$array[2]);

//Serialize
$serializeArray = serialize($array);

//Unserialize
$array = unserialize($serializeArray);

//Add a new element to the array
//If the internal pointer was preserved, the new array key should be 3.
//Instead the internal pointer has been reset, and the new array key is 0.
$array[] = 4;

//Expected Key - 3
//Actual Key - 0
echo "<pre>" , print_r($array, 1) , "</pre>";
?>
up
1
mark at bvits dot co dot uk
1 year ago
There is a type not mentioned in the user notes so far, 'E'.  This is the newer Enum class that can be utilised:

login_security|E:25:"Permission:manageClient"
To Top