【问题标题】:Unserialize() return empty object反序列化()返回空对象
【发布时间】:2016-12-16 17:29:54
【问题描述】:

我序列化了对象,但反序列化后对象为空,我无法弄清楚我做错了什么。

这是我的代码:

class Foo implements \Serializable {

    public $default = 10;
    public $setMe;
    public $removeOnSerialize = 'blah';

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

    public function unserialzie($serialized)
    {
        $unserialized = unserialize();
        $unserialize->removeOnSerialize = 'Set some value';
        return $unserialized;
    }

}

$obj = new Foo();
$obj->setMe = 9999;

print_r($obj) // here I have all as exepcted

$serialized = serialize($obj);

$unserialized = unserialize($serialized);

print_r($unserialized); 

//object properties after deserialization
$unserialized->default === 10 // correct
$unserialized->removeOnSerialize === 'Set some value' //correct
$unserialized->setMe === NULL // wrong, it should be 9999

正如你在反序列化后看到的'setMe'属性是空的。 但是 'default' 和 'removeOnSerialize' 已经通过了。

有什么想法吗?

问候,

【问题讨论】:

  • 这里有几个问题:return serialize($this); 你这样做是在序列化整个类。 $unserialized = unserialize(); 需要传递一个参数来反序列化。看看here 它是如何工作的。
  • 检查您的方法名称。你有unserialzie,应该有unserialize。您的代码在复制/粘贴后无法正常工作 - 请按照错误和警告进行操作 - 它们会为您提供指导。

标签: php oop serialization


【解决方案1】:

正如评论部分已经提到的,你不应该从unserialize 方法返回任何东西。它必须设置对象的值。 您还可能通过从serialize 方法对同一类的实例调用serialize 来获得堆栈溢出。 我想你可以这样做:

class Foo implements \Serializable
{
    public $default = 10;
    public $setMe;
    public $removeOnSerialize = 'blah';

    public function serialize()
    {
        unset($this->removeOnSerialze);
        return serialize($this->getData());
    }

    public function unserialize($serialized)
    {
        foreach (unserialize($serialized) as $key => $value) {
            $this->$key = $value;
        }
        $this->removeOnSerialize = 'Set some value';
    }

    protected function getData()
    {
        return get_object_vars($this);
    }
}

【讨论】:

  • 我在第一次尝试时就这样做了,我丢失了继承对象中的一些属性,所以我认为序列化整个对象可能会更好。
【解决方案2】:

使用自定义序列化,您有责任将要保存的内容提供给serialize(),并有责任解析来自unserialize() 的值

您可以将serialize 更改为:

public function serialize(){
    $toSave = ['setMe'=>$this->setMe];
    return serialize($toSave);
}

这样,removeOnSerialize 不会被保存。 unserialize 你可以这样做

public function unserialize($data){
    $data = unserialize($data);
    $this->setMe = $data['setMe'];
    $this->removeOnSerialize = 'Set some value';
}

Live demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 2022-01-14
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多