Serialisieren von SimpleXMLElement Objekten

Dieser Artikel widmet sich eher der Fehlermeldung „Warning: unserialize(): Node no longer exists in …“ in PHP. Das SimpleXML-Objekt wurde mit der Funktion simplexml_load_string() erzeugt und dann mit der Funktion serialize() serialisiert. Wenn man sich ein das serialisierte Objekt anschaut, scheint alles in Ordnung zu sein. Alle Felder, bzw. Objekteigenschaften wurden korrekt abgelegt. Was ist hier nun passiert?

In PHP ist es nicht möglich, PHP-eigene Objekte zu de-serialisieren. Das PHP SimpleXMLElement gehört zu den internen PHP-Library und kann nicht de-serialisiert werden. Die Funktion unserialize() kann zudem nur serialisiert Objekte verarbeiten die einen festen physischen Aufbau haben. d.h. Die Klasse für die Instanz muss physisch vorhanden sein, damit die Funktion unserialize() richtig de-serialisieren kann.

Als eine möglich Lösung, habe ich euch hier zwei Funktionen entworfen:

function MySerialize($toserialize)
{
    if($toserialize instanceof SimpleXMLElement)
    {
        $stdClass = new stdClass();
        $stdClass->type = get_class($toserialize);
        $stdClass->data = $toserialize->asXml();

        return serialize($stdClass);
    }

    return serialize($toserialize);
}

function MyUnserialize($tounserialize)
{
    $tounserialize = unserialize($tounserialize);

    if($tounserialize->type == 'SimpleXMLElement')
    {
        $tounserialize = simplexml_load_string($tounserialize->data);
    }

    return $tounserialize;
}

Wer aber ein Problem hat, sein Projekt komplett mit diese Funktionen zu ersetzen der kann auch dieses hot-hot-fix gerne verwenden.

$oUnserialized = unserialize(
                    str_replace(
                        array('O:16:"SimpleXMLElement":0:{}', 'O:16:"SimpleXMLElement":'),
                        array('s:0:"";', 'O:8:"stdClass":'),
                        $sYourSerializedObject
                    )
                 );

1 thought on “Serialisieren von SimpleXMLElement Objekten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.