将PHP序列化从PHP 5.3迁移到PHP 5.6

Yir*_*her 9 php migration serialization

我有一个复杂的结构,使用serialize()函数保存在MySQL数据库中,然后使用unserialize()转换回来.将系统从PHP 5.3迁移到PHP 5.6并在5.6中反序列化在5.3上序列化的数据后,结构已损坏.对象的某些引用现在显示为数组.

我的问题是:

  1. 是否有关于不同PHP版本中序列化/反序列化使用的不同编码的规范?(在我的Google搜索或PHP.net上的文档中找不到任何具体的内容)

  2. 如何将序列化数据从PHP 5.3编码转换为PHP 5.6编码?

Mat*_*ier 1

您可以将序列化数据转换为 JSON(使用 PHP 5.3 安装),将其保存到数据库,然后执行相反的操作(使用 PHP 5.6 安装)。

从 5.3 到 JSON:

$data = unserialize($strSerializedData);
$jsonData = json_encode($data);
Run Code Online (Sandbox Code Playgroud)

从 JSON 到 5.6 :

$data = json_decode($jsonData);
$strSerializedData= serialize($data );
Run Code Online (Sandbox Code Playgroud)

您可能需要调整发送到 json_decode 的选项以匹配原始数据。

此选项取决于正在序列化的数据。如果您的数据是类,那么这是行不通的。

另外,您的问题可能与文档中的此注释有关(此处):

5.6.0 通过将 C: 替换为 O: 来强制对象实例化而不调用构造函数来操作序列化数据现在将失败。