PHP 8.1 DOM文档序列化

问题描述 投票:0回答:3

我正在尝试使以下类与本机 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 serialization domdocument php-8.1
3个回答
2
投票

2021 年 8 月 10 日,此更改已提交到版本 8.1 RC1:

将 DOM 类标记为不可序列化

所以你不能再序列化这些类。


0
投票

这不再是问题,并且已针对 PHP ^8.1.25 || 修复^8.2.12 || ^8.3

更多详情:


-1
投票

这似乎与 DOMDocument 中的无效方法或无效 XML 内容有关。如果您不使用它,则效果很好https://3v4l.org/K91Vv

© www.soinside.com 2019 - 2024. All rights reserved.