PHP serialize() 未正确序列化 stdClass 对象

标签 php google-app-engine serialization

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

这对于类似的项目效果很好,但对于这个项目,我收到诸如“unserialize(): Error at offset 14 of 860 bytes”之类的错误(数字有所不同,具体取决于序列化的内容。)

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

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";...

这里可能不会显示,但“*”旁边有一些不可见的字符(在 Notepad++ 中,它们显示为[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"; ... 

所以看起来问题是在保存或取消序列化任何内容之前开始的。

最佳答案

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

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 转换为关联数组。

关于PHP serialize() 未正确序列化 stdClass 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46301648/

相关文章:

Java NIO 序列化 StreamCorruptException 无效类型代码

java - java中相关对象的序列化

php - Azure 网站 PHP 5.6 IIS 8.0 setlocale 函数问题

google-app-engine - Google App Engine - 内联/iframe 登录

google-app-engine - 如何最好地将单个 Google App Engine 应用程序部署到多个特定于区域的子域?

python - 如何获取 App Engine Datastore 中的 ID 字段?

Java 序列化 vs JSON vs XML

php - exec中的ffmpeg PHP变量不起作用

php - 找不到PHP Docker供应商Autoload.php

php - 如何从子表中回调 parent 的名字?