Ich versuche, die folgende Klasse mit der nativen PHP-Serialisierung kompatibel zu machen, insbesondere wenn sie unter PHP 8.1 ausgeführt wird.
class SerializableDomDocument extends DOMDocument { private $xmlData; public function __sleep(): array { $this->xmlData = $this->saveXML(); return ['xmlData']; } public function __wakeup(): void { $this->loadXML($this->xmlData); } }
Auf niedrigeren PHP-Versionen ist alles in Ordnung, aber 8.1 produziert 未捕获的异常:'SerializedDomDocument' 的序列化不允许
每当尝试将此类对象传递给 serialize()
Funktionen. Hier ist ein Beispiel für Code, der eine solche Ausnahme generieren würde: https://3v4l.org/m8sgc.
Ich kenne die __serialize()
/ __unserialize()
Methoden, die in PHP 7.4 eingeführt wurden, aber ihre Verwendung scheint auch nicht zu helfen. Der folgende Codeausschnitt verursacht die gleiche Ausnahme, die hier beobachtet wurde: 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']); } }
Ich bin sehr verwirrt über dieses Problem und wäre für jeden Tipp sehr dankbar. Im Moment scheint der einzige Weg nach vorne darin zu bestehen, explizite Normalisierer/Denormalisierer einzuführen, was zu erheblichen Änderungen an der Codebasis-API führen wird. Ich möchte diese Situation vermeiden.
2021 年 8 月 10 日,此更改已提交到版本 8.1 RC1:
将 DOM 类标记为不可序列化
因此您无法再序列化这些类。