我正在尝试使以下类与本机PHP序列化兼容,特别是在PHP 8.1上运行时。
class SerializableDomDocument extends DOMDocument
{
private $xmlData;
public function __sleep(): array
{
$this->xmlData = $this->saveXML();
return ['xmlData'];
}
public function __wakeup(): void
{
$this->loadXML($this->xmlData);
}
}
在较低的PHP版本中,这一切都很好,但是当试图将这样的对象传递给serialize()
函数时,8.1会产生Uncaught Exception: Serialization of 'SerializableDomDocument' is not allowed
。下面是产生这种异常的代码示例:https://3v4l.org/m8sgc.
我知道PHP 7.4中引入的__serialize()
/__unserialize()
方法,但使用它们似乎也没有帮助。下面的代码段导致了与这里观察到的相同的异常:https://3v4l.org/ZU0P3.
class SerializableDomDocument extends DOMDocument
{
public function __serialize(): array
{
return ['xmlData' => $this->saveXML()];
}
public function __unserialize(array $data): void
{
$this->loadXML($data['xmlData']);
}
}
这个问题把我难住了,如果你能给点提示,我将不胜感激。目前看来,唯一可行的方法是引入显式的规范化/反规范化,这将导致代码库API发生重大变化。我想避免那样。
2021年8月10日,此更改提交到8.1 RC1版本:
将DOM类标记为不可序列化
所以你不能再序列化那些类了
这似乎与DOMDocument中无效的方法或无效的XML内容有关。如果您不使用它,它也可以正常工作https://3v4l.org/K91Vv