PHP 객체 직렬화란?
PHP에서 serialize() 함수는 객체를 바이트 스트림(byte-stream) 형태의 문자열로 변환해 줍니다. 이 문자열에는 객체의 모든 속성(property) 변수가 포함되며, 메서드(method)는 저장되지 않습니다. 생성된 문자열은 파일 등 어디에든 저장할 수 있어 객체 데이터를 영구 보관하거나 전송하는 데 유용합니다.
반대로 저장된 바이트 스트림에서 원래 객체를 복원하려면 unserialize() 함수를 사용합니다. 단, 이 함수를 호출하기 전에 반드시 해당 클래스의 정의가 먼저 선언되어 있어야 한다는 점에 유의해야 합니다.
객체 직렬화 예제
먼저 아래 클래스의 객체를 직렬화하여 문자열 형태로 파일에 저장해 보겠습니다.
<?php
class test1{
private $name;
function __construct($arg){
$this->name=$arg;
}
}
$obj1=new test1("Kiran");
$str=serialize($obj1);
$fd=fopen("obj.txt","w");
fwrite($fd, $str);
fclose($fd);
?>위 코드를 실행하면 현재 폴더에 obj.txt 파일이 생성되고, 그 안에 직렬화된 객체 문자열이 저장됩니다.
역직렬화(Unserialize) 예제
이제 파일에서 바이트 스트림을 읽어 들여 원래 객체로 복원하는 코드를 살펴보겠습니다.
<?php
class test1{
private $name;
function __construct($arg){
$this->name=$arg;
}
function getname(){
return $this->name;
}
}
$filename="obj.txt";
$fd=fopen("obj.txt","r");
$str=fread($fd, filesize($filename));
$obj=unserialize($str);
echo "name: " . $obj->getname();
?>주의할 점은 역직렬화 시 test1 클래스의 정의가 스크립트 내에 포함되어 있어야 한다는 것입니다. 클래스 정의가 없으면 unserialize()는 __PHP_Incomplete_Class 객체를 반환하여 속성과 메서드에 정상적으로 접근할 수 없습니다.
실행 결과
위 코드를 실행하면 다음과 같은 출력 결과를 확인할 수 있습니다.
name: Kiran