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.


Alvine UML-Diagramm


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

string
serialize()

Serialisierung des Objekts und der Daten. In dem serialisierten Objekt werden auch Meta-Informationen zum Abgleich gespeichert.

bool
hasAssociatedProperties()

Prüfen ob das Objekt associative Eigenschaften besitzt

bool
hasVolatileProperties()

Prüfen ob das Objekt volatile Eigenschaften besitzt

checkAndAdjustSerialisation(array $serialization)

Umgang mit Versionen

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.

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.

Return Value

string String-Repräsentation des Objektes

at line 193
bool hasAssociatedProperties()

Prüfen ob das Objekt associative Eigenschaften besitzt

Return Value

bool

at line 205
bool hasVolatileProperties()

Prüfen ob das Objekt volatile Eigenschaften besitzt

Return Value

bool

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.

Parameters

array $serialization Daten des serialisiertes Objekts

Exceptions

UnserializeException Keine Übereinstimmung

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.

Parameters

string $serialized

Return Value

void