我正在尝试使以下类与本机 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 版本上一切都很好,但 8.1 每当尝试将此类对象传递给
Uncaught Exception: Serialization of 'SerializableDomDocument' is not allowed
函数时都会产生 serialize()
。以下是会产生此类异常的代码示例: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 发生重大变化。我想避免这种情况。
这不再是问题,并且已针对 PHP ^8.1.25 || 修复^8.2.12 || ^8.3
更多详情:
这似乎与 DOMDocument 中的无效方法或无效 XML 内容有关。如果您不使用它,则效果很好https://3v4l.org/K91Vv