【发布时间】:2019-07-10 12:01:02
【问题描述】:
我有一个使用 serialize() 存储在 MySql 中的对象。
现在我已经通过实现Serializable 接口更新了类定义,但我无法反序列化对象,因为:
Erroneous data format for unserializing 'ClassName'
此类的调试方法unserialize() 没有帮助 - 它甚至没有被调用。
举个例子,假设我有旧的 (A) 和新的 (B) 类声明:
<?php
class A {
public $hello = "world";
}
class B implements Serializable {
public $hello = "world";
public function serialize() {}
public function unserialize($serialized) { throw new Exception("test"); }
}
现在当我尝试反序列化数据时:
$data1 = 'O:1:"A":1:{s:5:"hello";s:5:"world";}';
$data2 = 'O:1:"B":1:{s:5:"hello";s:5:"world";}';
var_dump(unserialize($data1));
var_dump(unserialize($data2));
我明白了
object(A)#2 (1) {
["hello"]=>
string(5) "world"
}
<br />
<b>Warning</b>: Erroneous data format for unserializing 'B' in <b>[...][...]</b> on line <b>20</b><br />
<br />
<b>Notice</b>: unserialize(): Error at offset 11 of 36 bytes in <b>[...][...]</b> on line <b>20</b><br />
bool(false)
【问题讨论】:
-
是否安装了任何框架和/或扩展?
-
不,它是纯 php 7.3
-
PHP 的序列化有时非常难以预测,并且充满了细微差别。我的猜测是实现序列化接口以某种方式改变了序列化过程(通过改变要使用的数据)它不再像以前没有使用接口时一样,因此序列化抱怨无效数据。如果可能,最好迁移到 json。
-
对这个问题投赞成票真的不再合适。它包含重现问题的完整 MCVE。
标签: php oop serialization