【问题标题】:Prevent object rewrite when serializing and unserializing序列化和反序列化时防止对象重写
【发布时间】:2016-04-20 04:58:45
【问题描述】:

我注意到在序列化一个简单对象时我丢失了数组内容,并且我假设我正在以某种方式重写数组。如何正确构建代码以允许从最初启动的对象中保存数据?

<?php

class MyClass {

    private $array;

    function __construct($array) {
        $this->array = $array;
    }

    public function __sleep() {
        return $this->array;
    }
}

$array = array(
    'i1' => 1,
    'i2' => 2,
    'i3' => 3,
    'i4' => 4
);

$obj = new MyClass($array);
$ser = serialize($obj);
$des = unserialize($ser);

print_r($obj);
echo '<br><br>';
print_r($ser);
echo '<br><br>';
print_r($des);
?>

输出:

MyClass Object ( [array:MyClass:private] => Array ( [i1] => 1 [i2] => 2 [i3] => 3 [i4] => 4 ) )

O:7:"MyClass":4:{s:1:"1";N;s:1:"2";R:2;s:1:"3";R:2;s:1:"4";R:2;}

MyClass Object ( [array:MyClass:private] => [1] => [2] => [3] => [4] => ) 

【问题讨论】:

标签: php serialization


【解决方案1】:

尝试将Serializable 接口实现到MyClass

class MyClass implements Serializable {

    private $array;

    function __construct($array) {
       $this->array = $array;
    }

    public function serialize() {
        return serialize($this->array);
    }

    public function unserialize($array) {
        $this->data = unserialize($array);
    }

    public function __sleep() {
        return $this->array;
    }
}

【讨论】:

  • 就是这样!谢谢。
  • 我已经阅读了一些例子,我认为在实现Serializable 时我不需要神奇的函数__sleepphp.net/manual/en/class.serializable.php
  • 是的,忽略它。如果有帮助,您可以接受答案。
  • 谢谢,我会考虑的。如果可能的话,我正在寻找更接近该示例的答案。在确定没有更接近的解决方案之前,我会让这个问题保持开放。
【解决方案2】:

documentation for magic __sleep() method我们可以找到应该如何使用的解释

该函数在任何序列化之前运行。它可以清理 对象并且应该返回一个包含所有名称的数组 该对象的变量应该被序列化。

我必须返回它的名称,而不是只返回 __sleep 中的私有变量。

<?php

class MyClass {

    private $array;
    private $test;

    function __construct($array, $test) {
        $this->array = $array;
        $this->test = $test;
    }

    public function __sleep() {        
        return array('array', 'test');
    }
}

$test = 'test';
$array = array(
    'i1' => 1,
    'i2' => 2,
    'i3' => 3,
    'i4' => 4
);

$obj = new MyClass($array, $test);
$ser = serialize($obj);
$des = unserialize($ser);

print_r($obj);
echo '<br><br>';
print_r($ser);
echo '<br><br>';
print_r($des);

结果:

MyClass Object ( [array:MyClass:private] => Array ( [i1] => 1 [i2] => 2 [i3] => 3 [i4] => 4 ) [test:MyClass:private] => test )

O:7:"MyClass":2:{s:14:"MyClassarray";a:4:{s:2:"i1";i:1;s:2:"i2";i:2;s:2:"i3";i:3;s:2:"i4";i:4;}s:13:"MyClasstest";s:4:"test";}

MyClass Object ( [array:MyClass:private] => Array ( [i1] => 1 [i2] => 2 [i3] => 3 [i4] => 4 ) [test:MyClass:private] => test ) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-14
    • 2014-12-24
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 2020-02-24
    • 2020-05-03
    相关资源
    最近更新 更多