我有一个复杂的结构,使用serialize()函数保存在MySQL数据库中,然后使用unserialize()转换回来。将系统从PHP 5.3迁移到PHP 5.6并在5.6中反序列化在5.3上序列化的数据后,结构已损坏。对象的某些引用现在显示为数组。
我的问题是:
是否有关于不同PHP版本中序列化/反序列化使用的不同编码的规范? (在我的Google搜索或PHP.net上的文档中找不到任何具体的内容)
如何将序列化数据从PHP 5.3编码转换为PHP 5.6编码?
答案 0 :(得分:4)
是的,在PHP5.6中更改了对象的序列化。具体而言,许多与对象序列化相关的领域都在PHP5.6中进行了整理
PHP unserialize manual中有一个含糊的提示:
5.6.0通过将O:替换为C来操作序列化数据:强制对象实例化而不调用构造函数 失败。
然而,看看错误列表会发现report 68099内有更多内容。它还指出原始格式没有官方文件:
“原始行为(我们允许旧的序列化格式) 用于使用新格式的类)从未记录过 官方支持,“
请注意,该讨论的最终结果是“无法修复”。
所以基本上,你的选择是:
尝试使用其他一个序列化程序作为在PHP版本之间导出数据的方法。例如session_encode也可以处理对象。
转换脚本。有一个广泛记录的版本 PHP internals上的当前格式,您可以使用它 旧格式上的迭代器更新语法。
答案 1 :(得分:1)
您可以将序列化数据转换为JSON(使用PHP 5.3的安装),将其保存到数据库,然后执行对等(使用PHP 5.6的安装)。
从5.3到JSON:
$data = unserialize($strSerializedData);
$jsonData = json_encode($data);
从JSON到5.6:
$data = json_decode($jsonData);
$strSerializedData= serialize($data );
您可能需要调整发送到json_decode的选项以匹配原始数据。
此选项取决于要序列化的数据。如果您的数据是类,则无效。
此外,您的问题可能与文档(here)中的此注释有关:
5.6.0通过将C:替换为O来操作序列化数据:强制对象实例化而不调用构造函数现在将失败。