Как работает сериализация / десериализация объекта? - PullRequest
7 голосов
/ 24 октября 2011

Я читал о сериализации / десериализации концепций PHP. Мне было интересно, как они хранятся в файловой системе / БД. Я думаю, что это в двоичном формате. Тем не менее, мне интересно, как весь класс хранится? Я понял, что данные в элементе данных могут быть сохранены, но как хранятся методы?

Я имею в виду, как PHP знает, какой код написан внутри функции, скажем, someFunc()?

$obj = new ClassName();
$obj->someFunc();
$serial = serialize($obj);
$unserialobj = unserialize($serial);
$unserialobj->someFunc();

PHP может знать, что делать в строке № 2, но как он знает, что делать в строке № 5, которая является несериализованным объектом? Сохраняет ли он также код?

Ответы [ 3 ]

8 голосов
/ 24 октября 2011

При сериализации объекта PHP сохраняет только текущее состояние объекта, то есть значения его свойств.Он не сериализует свои методы.Соответствующий класс должен быть загружен в память во время десериализации.PHP восстановит состояние объекта из сериализованной строки и получит остальную информацию (структуру и методы) из одноименного класса.

5 голосов
/ 24 октября 2011

PHP может знать, что делать в строке № 2, но как он знает, что делать в строке № 5, которая является несериализованным объектом? это также сохраняет код?

Да, serialize() сохранит информацию о классе, экземпляром которого является этот объект, вместе с его состоянием, поэтому при десериализации вы получите экземпляр этого класса, который в данном случае равен ClassName.

0 голосов
/ 25 июля 2014

Это простой пример для понимания сериализации и десериализации объекта в php.мы преобразуем объект в строку, используя сериализацию, и используем текущее состояние этого объекта (с присвоенными значениями) после десериализации на другой странице.

c.php

<?php class A {
      public $one ;

      public function A($val) {
          $this->one=$val;
         // echo $this->one;
      }

      function display(){
        echo $this->one;
      }

  }
  ?> 

c.php файл имеет классс именем A .
a.php

<? 
require_once "c.php";

$ob= new A('by Pankaj Raghuwanshi : Object Searlization.');

$ob->display(); // Output is: by Pankaj Raghuwanshi : Object Searlization.

$s = serialize($ob);

// echo $s will show  a string of an object

?>
<br><A href='b.php?s=<?=$s;?>'>B-file</a>

Мы сериализуем этот объект, преобразуем его в строку и передаем эту строку на другую страницу методом get.

Примечание: мы можем передать эту строку одну страницу на другую страницу с помощью различных методов, таких как сессия, мы можем сохранить в БД и получить другую страницу, сохранить в текстовом файле.

Мы будем десериализовать этот объект с другим именем файла b.php

b.php

<? 
require_once "c.php";

$ob = unserialize($_GET[s]);
$ob->display();
// Output is: by Pankaj Raghuwanshi : Object Searlization.
?> 

после десериализации, объект, демонстрирующий то же поведение, что и файл .php, иприсвойте значение a.php еще в памяти объекта.если мы будем десериализовать этот объект после многих HTTP-запросов.Объект сохранит все присвоенные значения в своей памяти.

...