Home  >  Q&A  >  body text

DOMDocument serialization in PHP 8.1

I'm trying to make the following class compatible with native PHP serialization, specifically when running on 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);
    }
}

Everything was fine on lower PHP versions, but 8.1 throws Uncaught exception: Serialization of 'SerializedDomDocument' is not allowed whenever trying to pass such an object to serialize() function. Here is an example of code that would generate such an exception: https://3v4l.org/m8sgc.

I'm aware of the __serialize() / __unserialize() methods introduced in PHP 7.4, but using them doesn't seem to help either. The following code snippet causes the same exception observed here: 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']);
    }
}

I'm very confused about this problem and would really appreciate any tips. At the moment it seems the only way forward is to introduce explicit normalizers/denormalizers, which will result in significant changes to the codebase API. I want to avoid this situation.

P粉891237912P粉891237912251 days ago479

reply all(1)I'll reply

  • P粉041881924

    P粉0418819242024-01-17 09:46:33

    On August 10, 2021, this change was committed to version 8.1 RC1:

    Mark DOM classes as non-serializable

    So you can no longer serialize these classes.

    reply
    0
  • Cancelreply