SerializableImplementation
trait SerializableImplementation
SerializableImplementation
Das Trait definiert eine Implementierung des \Serializable Interfaces und kann in Zusammenspiel mit der Verwendung des \Serializable-Interfaces angewendet werden.
Um eine fertige Implementierung umzusetzen, reicht es das Interface einzubinden und das Trait mittelse use anzugeben. Wird in der Klasse, die den Trait verwendet die Konstante SERIALVERSION definiert, so kann darüber die Version der Serialisierung geprüft werden. Wird die Konstante nicht definiert, so wird immer die Version 1 genommen. In allen von Alvine\Core\Alvine abgeleiteten Klassen ist die Konstante definiert.
Lambdafunktionen
Werden Lambdafunktionen definiert, so kann das Objekt nicht mehr serialisiert werden. Der Aufruf von serialize würde in so einem Fall eine PHP Exception werfen. Die Lambdafunktion wird nicht im Scope des Objekts ausgeführt. Es steht als erster Parameter allerdings eine Referenz auf das Objekt zur Verfügung.
class NewClass implements \Serializable {
use SerializableImplementation;
const SERIALVERSION = 1;
// ... code
}
Volatile Werte
Als Besonderheit können Eigenschaften mit der Vorsilbe volatile von der Serialisierung ausgeschlossen werden. Im folgenden Beispiel wird $index serialisiert, $volatileIndex jedoch nicht.
class NewClass implements \Serializable {
use SerializableImplementation;
protected $volatileIndex = 1;
}
Versionsprüfung
Abgeleitetet Klassen müssen, wenn Sie die Prüfung der Version nutzen wollen, die Methode Alvine::checkAndAdjustSerialisation() überschreiben. Im folgenden Sequenzdiagramm ist der Aufruf von Alvine::checkAndAdjustSerialisation() beschrieben.
Fehler beim Serialisieren
Beim Serialisieren können mehrere Fehler auftreten. Einige werden über eine UnserializeException abgefangen, andere direkt von PHP. In den Fällen in denen PHP den Fehler erkennt (z.B. wenn die gewünschte Klasse nicht verfügbar ist), dann wird eine PHP \Exception geworfen.
Debugging
Sollten beim Ausführen von unserialise die Fehlermeldung Class __PHP_Incomplete_Class has no unserializer kommen, dass die Klasse fehlt, kann mit folgendem Konstrukt der Klassenname ermittelt werden:
\ini_set('unserialize_callback_func', 'debug_unserialize');
function debug_unserialize($classname) {
die(var_dump($classname));
}
Properties
protected boolean | $hasAssociatedProperties | ||
protected boolean | $hasVolatileProperties |
Methods
Serialisierung des Objekts und der Daten. In dem serialisierten Objekt werden auch Meta-Informationen zum Abgleich gespeichert.
Prüfen ob das Objekt associative Eigenschaften besitzt
Prüfen ob das Objekt volatile Eigenschaften besitzt
Umgang mit Versionen
Diese Methode wird in der Folge durch \unserialize aufgerufen und initialisert das neue Objekt. Diese Methode sollte so nicht selber aufgerufen werden.
Details
at line 122
string
serialize()
Serialisierung des Objekts und der Daten. In dem serialisierten Objekt werden auch Meta-Informationen zum Abgleich gespeichert.
Soll eine abgeleitete Klasse nicht serialisierbar sein, so muss diese Methode überschrieben werden und eine Exception werfen.
Eigenschaften die mit volatile oder associated beginnen werden gesonder behandelt. Eigenschaften mit Prefix volatile werde nicht serialisiert. Bei Eigenschaften mit der Vorsilbe associated wird nur die ID des Objektes serialisiert. Wird in der Eigenschaft kein Objekt gespeichert wird eine TypeException geworfen.
at line 193
bool
hasAssociatedProperties()
Prüfen ob das Objekt associative Eigenschaften besitzt
at line 205
bool
hasVolatileProperties()
Prüfen ob das Objekt volatile Eigenschaften besitzt
at line 228
protected
checkAndAdjustSerialisation(array $serialization)
Umgang mit Versionen
Diese Methode überprüft ein Objekt und repariert im idealfall ältere Kopien. Kann eine alte Kopie nicht wieder hergestellt werden, so wird eine Exeption geworfen.
Diese Methode muss von den abgeleiteten Klassen überschrieben werden. In der abgeleiteten Klasse sollte die Parent-Methode aufgerufen werden.
at line 252
void
unserialize(string $serialized)
Diese Methode wird in der Folge durch \unserialize aufgerufen und initialisert das neue Objekt. Diese Methode sollte so nicht selber aufgerufen werden.