Discussion:
Doctrine und Objekte serialisieren
(zu alt für eine Antwort)
Andre Schmidt
2010-01-03 03:13:40 UTC
Permalink
Hallo,

ich weiß grundsätzlich nicht, ob hier überhaupt noch mitgelesen wird. Über
ein paar Lebenszeichen würde ich mich freuen.

Noch mehr freuen würde ich mich, wenn mir jemand helfen könnte.

Problem:
Ich habe ein recht komplexes Objekt mit mehreren Relationen (1:n, n:m) und
müsste das nun in einer Session speichern um es weiter zu bearbeiten.

Ein $_SESSION['MEINEINSTANCE']=serialize($object); funktioniert, aber ...

ein $mynewobject=unserialize($_SESSION['MEINEINSTANCE']); liefert nicht das
vollständige Objekt zurück, es fehlen die Relationen.

Woran kann das liegen? Leider finde ich über Google nichts über diese
Problematik.

Danke und Gruß
André
Andreas Kraftl
2010-01-03 07:04:46 UTC
Permalink
Post by Andre Schmidt
Ein $_SESSION['MEINEINSTANCE']=serialize($object); funktioniert, aber ...
ein $mynewobject=unserialize($_SESSION['MEINEINSTANCE']); liefert nicht das
vollständige Objekt zurück, es fehlen die Relationen.
Woran kann das liegen? Leider finde ich über Google nichts über diese
Problematik.
Das einzige was mir hierzu einfällt ist, dass unserialize() nur
funktioniert, wenn die relevanten Klassen vor Aufruf von unserialize()
geladen sind.

Im schlimmsten Fall ein wenig selber forschen und debuggen.

Liebe Grüße
Andreas
--
Kraftl EDV - Dienstleistungen
Linux, Schulungen, Webprogrammierung
http://www.kraftl.at
Niels Braczek
2010-01-03 09:39:32 UTC
Permalink
Post by Andre Schmidt
ich weiß grundsätzlich nicht, ob hier überhaupt noch mitgelesen wird. Über
ein paar Lebenszeichen würde ich mich freuen.
Doch, doch ...
Post by Andre Schmidt
ein $mynewobject=unserialize($_SESSION['MEINEINSTANCE']); liefert nicht das
vollständige Objekt zurück, es fehlen die Relationen.
Woran kann das liegen? Leider finde ich über Google nichts über diese
Problematik.
Naja, Tante G. fragen ist gut, Manual lesen ist besser.

"serialize() handles all types, except the resource-type. You can even
serialize() arrays that contain references to itself. Circular
references inside the array/object you are serializing will also be
stored. Any other reference will be lost."[1]

Weiter steht dort:

"When serializing objects, PHP will attempt to call the member function
__sleep prior to serialization. This is to allow the object to do any
last minute clean-up, etc. prior to being serialized. Likewise, when the
object is restored using unserialize() the __wakeup member function is
called."[2]

Also lannst du dir das gewünschte Verhalten nach Belieben mit __sleep()
und __wakeup() bauen.

[1] http://de3.php.net/manual/en/function.serialize.php
[2] ebd.

MfG
Niels
--
| http://www.kolleg.de · Das Portal der Kollegs in Deutschland |
| http://www.bsds.de · BSDS Braczek Software- und DatenSysteme |
| Webdesign · Webhosting · e-Commerce · Joomla! Content Management |
------------------------------------------------------------------
Andre Schmidt
2010-01-03 13:41:15 UTC
Permalink
Post by Niels Braczek
Post by Andre Schmidt
ich weiß grundsätzlich nicht, ob hier überhaupt noch mitgelesen wird.
Über ein paar Lebenszeichen würde ich mich freuen.
Doch, doch ...
Na das ist ja schonmal was...
Post by Niels Braczek
Post by Andre Schmidt
ein $mynewobject=unserialize($_SESSION['MEINEINSTANCE']); liefert nicht
das vollständige Objekt zurück, es fehlen die Relationen.
Naja, Tante G. fragen ist gut, Manual lesen ist besser.
Nun vielen Dank. Hilf aber erstmal nicht weiter.

Das Verhalten von serialize() ist mir bekannt. Nur habe ich bevor ich
Doctrine genutzt habe ebenfalls Objekte mit Arrays auf andere Objekte
serialisiert und das funktionierte wunderbar. (Mit Ausnahme natürlich
Resource Typen, wie z.B. Datenbankverbindungen)

Das Verhalten von Doctrine wundert mich nun in der Tat ein wenig. Ist
Doctrine etwa vom Typ Resource? (und wie finde ich das eventuell raus?)
Post by Niels Braczek
Also lannst du dir das gewünschte Verhalten nach Belieben mit __sleep()
und __wakeup() bauen.
Ja ... aber das hilft gar nichts. Wenn ich ein Objekt nur um eine Relation
erweiter und bevor ich das in der Datenbank speicher erstmal in einer
Session halten möchte (bei XAJAX-Anwendungen ja keine Seltenheit) dann
stehe ich vor einem "kleinen" Problem. Vor allem dann, wenn das
Serialisieren eines Objektes erstmal grundsätzlich (scheinbar) alle
Relationen zum Objekt kappt.

Danke und Gruß
André
Niels Braczek
2010-01-03 17:03:50 UTC
Permalink
Post by Andre Schmidt
Post by Niels Braczek
Also lannst du dir das gewünschte Verhalten nach Belieben mit __sleep()
und __wakeup() bauen.
Ja ... aber das hilft gar nichts.
Doch, natürlich hilft das.
Post by Andre Schmidt
Wenn ich ein Objekt nur um eine Relation
erweiter und bevor ich das in der Datenbank speicher erstmal in einer
Session halten möchte (bei XAJAX-Anwendungen ja keine Seltenheit) dann
stehe ich vor einem "kleinen" Problem. Vor allem dann, wenn das
Serialisieren eines Objektes erstmal grundsätzlich (scheinbar) alle
Relationen zum Objekt kappt.
Dann musst du einfach in der __sleep()-Funktion die verknüpften Objekte
ebenfalls serialisieren und dir die Verknüpfung merken; in __wakeup()
stellst du alle Objekte und die Relationen wieder her.

MfG
Niels
--
| http://www.kolleg.de · Das Portal der Kollegs in Deutschland |
| http://www.bsds.de · BSDS Braczek Software- und DatenSysteme |
| Webdesign · Webhosting · e-Commerce · Joomla! Content Management |
------------------------------------------------------------------
Andre Schmidt
2010-01-03 17:57:16 UTC
Permalink
Post by Niels Braczek
Dann musst du einfach in der __sleep()-Funktion die verknüpften Objekte
ebenfalls serialisieren und dir die Verknüpfung merken; in __wakeup()
stellst du alle Objekte und die Relationen wieder her.
Nunja, "einfach" ist so eine Sache. Mich wundert es hier an dieser Stelle,
warum das eben nicht "einfach" ist, sondern man erst >umständlich<
wieder "Hand" anlegen muss. Ein Objekt in einer Session zwischen zu
speichern ist doch keine Anforderung, die ich als einziger stelle.

Im Moment bin ich auf die Methode Doctrine_Record::toArray() und
Doctrine_Record::fromArray() gestoßen, die scheinbar in meinem Sinne
funktionieren, sofern das um Sessions geht. Nur leider find ich bei einem
wiederherstellten Objekt eine n:m Relation nicht wieder... Jetz muss ich
nochmal prüfen, ob es an Programm liegt oder an Doctrine selbst.

Gruß
André
SeveQ
2010-02-17 01:09:06 UTC
Permalink
Post by Andre Schmidt
Post by Niels Braczek
Dann musst du einfach in der __sleep()-Funktion die verknüpften Objekte
ebenfalls serialisieren und dir die Verknüpfung merken; in __wakeup()
stellst du alle Objekte und die Relationen wieder her.
Nunja, "einfach" ist so eine Sache. Mich wundert es hier an dieser Stelle,
warum das eben nicht "einfach" ist, sondern man erst >umständlich<
wieder "Hand" anlegen muss. Ein Objekt in einer Session zwischen zu
speichern ist doch keine Anforderung, die ich als einziger stelle.
Im Moment bin ich auf die Methode Doctrine_Record::toArray() und
Doctrine_Record::fromArray() gestoßen, die scheinbar in meinem Sinne
funktionieren, sofern das um Sessions geht. Nur leider find ich bei einem
wiederherstellten Objekt eine n:m Relation nicht wieder... Jetz muss ich
nochmal prüfen, ob es an Programm liegt oder an Doctrine selbst.
Gruß
André
Hallo,

ich stehe nun vor exakt dem selben Problem. Hat es evtl. jemand lösen
können?

Danke!

Grüße,
Hendrik
SeveQ
2010-02-17 01:45:23 UTC
Permalink
Post by Andre Schmidt
Post by Andre Schmidt
Post by Niels Braczek
Dann musst du einfach in der __sleep()-Funktion die verknüpften Objekte
ebenfalls serialisieren und dir die Verknüpfung merken; in __wakeup()
stellst du alle Objekte und die Relationen wieder her.
Nunja, "einfach" ist so eine Sache. Mich wundert es hier an dieser Stelle,
warum das eben nicht "einfach" ist, sondern man erst >umständlich<
wieder "Hand" anlegen muss. Ein Objekt in einer Session zwischen zu
speichern ist doch keine Anforderung, die ich als einziger stelle.
Im Moment bin ich auf die Methode Doctrine_Record::toArray() und
Doctrine_Record::fromArray() gestoßen, die scheinbar in meinem Sinne
funktionieren, sofern das um Sessions geht. Nur leider find ich bei einem
wiederherstellten Objekt eine n:m Relation nicht wieder... Jetz muss ich
nochmal prüfen, ob es an Programm liegt oder an Doctrine selbst.
Gruß
André
Hallo,
ich stehe nun vor exakt dem selben Problem. Hat es evtl. jemand lösen
können?
Danke!
Grüße,
Hendrik
Aaaaah, mal kurz in die Record.php geschaut, da findet sich folgende
Funktion:

function serializeReferences($bool = null)...

diese vor dem serialize($object) mit $bool = true aufrufen und schon
gehen die Relations beim de-/serialisieren nicht mehr verloren.

Grüße,
Hendrik

Lesen Sie weiter auf narkive:
Loading...