PHP serialize()没有正确地序列化stdClass对象

时间:2017-09-19 13:22:33

标签: php google-app-engine serialization

我在Google App Engine上运行了一个应用程序(使用PHP 5.5.38),并且我使用Laravel程序包来缓存查询结果。

这适用于类似的项目,但对于这个,我得到错误,例如," unserialize():错误在860字节的偏移量14和#34; (数字因系列化而异。)

错误发生在只有这两个函数的类中:

public function encode($data){
    return serialize($data);
}

public function decode($data){
    return unserialize($data);
}

我发现在本地测试应用程序时,一切正常,序列化数据看起来像这样:

a:1:{i:0;O:8:"stdClass":27:{s:2:"id";i:2;s:10:"first_name";s:4:"Zach";...

但是当我在App Engine上使用相同的数据运行它时,它会返回:

a:1:{i:0;O:8:"@*lass":27:{s:2:"id";i:2;s:10:"first_name";s:4:"Zach";...

这里可能没有显示,但是' *'旁边有隐形字符。 (在记事本++中,它们显示为[ENQ]和[DLE])。

我认为对unserialize()的调用失败,因为序列化数据包含@ * lass而不是stdClass,但我不知道导致它的原因,或者如何防止它。我尝试使用str_replace,它最初工作,但不是一切。我还确保PHP使用UTF-8作为默认字符集。

编辑:我修改了编码功能,试图找出问题开始的时刻。 我现在有:

public function encode($data)
{
    $serialized = serialize($data);
    try{
        unserialize($serialized);
    } catch (\Exception $ex) {
        var_dump($serialized);
        die;
    }
    return $serialized;
}

当它在服务器上执行时,它会输出:

a:1:{i:0;O:8:"@*lass":27:{s:2:"id";i:2;s:10:"first_name";s:4:"Zach"; ... 

因此,在保存或反序列化任何内容之前,问题似乎就开始了。

1 个答案:

答案 0 :(得分:1)

可能不是一个理想的解决方案,但这似乎有用......

public function encode($data)
{
    return serialize(json_decode(json_encode($data), true));
}

public function decode($data)
{
    return json_decode(json_encode(unserialize($data)));
}

问题似乎来自序列化一个stdClass对象数组,所以我认为它有助于将stdClass转换为关联数组。