객체 직렬화

객체를 직렬화하기 - 세션의 객체

serialize() 는 PHP에 저장할수 있는 어떠한 값의 바이트스트림 표현을 포함한 문자열을 반환합니다. unserialize() 는 이 문자열을 원래의 변수값을 재생성하는데 사용할수 있습니다. serialize로 객체를 저장하는것은 객체안의 모든 변수들을 저장하는것을 의미합니다. 클래스명을 제외한 객체내부의 메서드는 저장되지 않을 것입니다.

객체를 unserialize() 할수 있도록 하기 위해서는, 해당 객체의 클래스 정의가 필요 합니다. 이 말은, 클래스 A의 객체를 직렬화 하면 클래스 A의 모든 변수들의 값을 포함하는 문자열을 얻게 됩니다. 다른 파일에서 이 문자열을 역직렬화하여 클래스 A의 객체를 만들고자 할때 해당 파일에는 클래스 A가 먼저 정의 되어 있어야 합니다. 이것은 클래스 A의 정의를 파일로 만들어 인클루드 하거나 spl_autoload_register() 를 사용할 수 있습니다.

<?php
// classa.inc:
  
  
class {
      public 
$one 1;
    
      public function 
show_one() {
          echo 
$this->one;
      }
  }
  
// page1.php:

  
include("classa.inc");
  
  
$a = new A;
  
$s serialize($a);
  
// store $s somewhere where page2.php can find it.
  
file_put_contents('store'$s);

// page2.php:
  
  // 역직렬화를 위해 필요합니다.
  
include("classa.inc");

  
$s file_get_contents('store');
  
$a unserialize($s);

  
// 이제 $a 객체의 show_one() 함수를 사용합니다.
  
$a->show_one();
?>

응용프로그램이 세션과 session_register() 를 객체를 등록하기 위해 사용한다면 각 PHP 페이지의 마지막에서 이 객체들은 자동으로 직렬화됩니다. 그리고 각각의 페이지 첫부분에서 자동으로 역직렬화 됩니다. 이 얘기는 세션이 공유되는 어떤 페이지에서든 객체를 다시 복원할 수 있음을 의미합니다. 그러나, session_register() 는 PHP 5.4.0 부터 제거 되었습니다.

추후에 사용할 목적으로 객체를 직렬화 했다면, 해당 응용프로그램 전체에 클래스 정의를 포함하는것을 강력하게 추천합니다. 그렇지 않으면 __PHP_Incomplete_Class_Name 클래스의 객체를 반환하게 되며 아무런 메서드도 가지지 않으며 객체가 쓸모없음을 표시할것입니다.

앞의 예제에서 $asession_register("a") 로 세션이 되었다면, classa.inc 파일을 page1.phppage2.php뿐만이 아닌 모든 페이지에 인클루드 해야 합니다.

주제에 벗어나는 얘기지만, __sleep()__wakeup() 메서드를 통해 객체의 직렬화와 역직렬화 이벤트를 후킹할 수 있습니다. __sleep() 은 또한 객체의 일부 프로퍼티만 직렬화 할수 있습니다.

add a note add a note

User Contributed Notes 2 notes

up
171
php at lanar dot com dot au
10 years ago
Note that static members of an object are not serialized.
up
18
michael at smith-li dot com
4 years ago
Reading this page you'd be left with the impression that a class's `serialize` and `unserialize` methods are unrelated to the `serialize` and `unserialize` core functions; that only `__sleep` and `__unsleep` allow you to customize an object's serialization interface. But look at http://php.net/manual/en/class.serializable.php and you'll see that there is a more straightforward way to control how a user-defined object is serialized and unserialized.
To Top