对象序列化/反序列化如何工作?

时间:2011-10-24 09:11:44

标签: php object-serialization

我正在阅读关于PHP的序列化/反序列化概念。我想知道它们是如何存储在filesystem / db中的。我猜它是二进制格式。但是,我想知道整个班级是如何存储的?我知道数据成员中的数据可以存储,但方法是如何存储的?

我的意思是,PHP如何知道在someFunc()函数中编写的代码是什么?

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

PHP可以知道第2行要做什么,但它知道如何在第5行(这是一个非序列化的对象)做什么?它是否也保存了代码?

3 个答案:

答案 0 :(得分:8)

在序列化对象时,PHP仅存储对象的当前状态,即其属性值。它没有序列化它的方法。在反序列化时,需要在内存中加载相应的类。 PHP将从序列化字符串中恢复对象的状态,并从同名的类中获取其余信息(结构和方法)。

答案 1 :(得分:5)

  

PHP可以知道第2行要做什么,但它知道如何在第5行(这是一个非序列化的对象)做什么?它也保存了代码吗?

是的,serialize()将保存有关此对象所属的类的信息及其状态,因此当您反序列化时,您将获得该类的实例,在本例中为{{ 1}}。

答案 2 :(得分:0)

这是在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方法将此字符串传递给另一个页面。

注意:我们可以将这个字符串一页传递到另一个页面,使用各种方法,比如使用session,我们可以保存到DB中并获取另一个页面,保存到文本文件中。

我们将在另一个文件名上反序列化此对象是b.php

b.php

<? 
require_once "c.php";

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

反序列化后,对象显示与a.php文件相同的行为 并且指定a.php的值仍然在对象的内存中。如果我们将在许多http请求后反序列化此对象。对象将在其内存中保留所有赋值。