【问题标题】:How does object serialize/unserialize work?对象序列化/反序列化如何工作?
【发布时间】:2011-10-24 09:11:44
【问题描述】:

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

我的意思是,PHP 怎么知道 someFunc() 的函数里面写了什么代码?

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

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

【问题讨论】:

  • serialize() 不会在任何地方存储任何内容。它只是序列化一个对象并将结果作为字符串提供给您。

标签: php object-serialization


【解决方案1】:

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

【讨论】:

  • 您能否通过“在反序列化时需要将相应的 clss 加载到内存中”来说明您的意思?我该怎么做?
  • @user 只是include 'my_class.php';。 PHP 只需要看到你的类的定义。换句话说,如果你能做到new ClassName,那么你就可以反序列化一个ClassName类型的对象。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    这是理解 serializeunserialize 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 的类。
    一个.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.
    ?> 
    

    反序列化后,对象表现出与 .php 文件相同的行为 并且 a.php 的赋值仍然在 object 的内存中。如果我们在多次 http 请求后反序列化这个对象。对象会将所有分配值持久保存在其内存中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-27
      • 2015-06-28
      • 2011-04-06
      • 1970-01-01
      • 2012-09-18
      • 2012-04-15
      • 1970-01-01
      相关资源
      最近更新 更多