Objekt serialisieren [sleep & wakeup ?]

Online-Skater

Erfahrenes Mitglied
Hi Tutorianer,

ich möchte gern eine eigene PHP-Klasse serialisieren. Das Problem ist das diese Klasse eine PHP interne Klasse als Attribut besitzt, siehe Code. Die Klasse ist aufs wesentliche reduziert:
PHP:
<?php

class ToolConfiguration{

	private $toolName = NULL; 	// string representation of toolName 
	private $config = NULL;		// SimpleXMLElement - PHP intern class
	private $toolLocation = NULL;	// string representation of toolLocation
	
	public function __construct(){
		// acutally nothing happens :)
	}
	
	public function setToolName($toolName){
		$this->toolName = $toolName;
	}

	public function getToolName(){
		return $this->toolName;
	}

	public function getConfig(){
		return $this->config;
	}	
	
	public function setConfig($config){
		$this->config = $config;
	}

	public function getToolLocation()
	{
		return $this->toolLocation;
	}
	
	/**
	 * This function reads a configuration file, which is identified by the toolname.
	 * It will also set toolName and toolLocation for easier access.
	 */	
	public function readConfigurationFile(){
		$name = 'test.xml';
		$this->config = simpleXML_load_file($name);
	}
}

?>
Bei folgendem Testcode:
PHP:
include 'ToolConfiguration.class.php';

$toolCfg = new ToolConfiguration();
$toolCfg->setToolName('test');
$toolCfg->readConfigurationFile();

$save = serialize($toolCfg); // serialisieren

$load = unserialize($save); // deserialisieren

if ($load instanceof ToolConfiguration)
{
	echo '<pre>' . print_r($load, true) . '</pre>';
}
else
{
	echo 'Keine Instanz von ToolConfiguration';
}
kommt folgende Warnung:
Code:
Warning: unserialize() [function.unserialize]: Node no longer exists in /opt/lampp/htdocs/test/test.php on line 11

Warning: unserialize() [function.unserialize]: Node no longer exists in /opt/lampp/htdocs/test/test.php on line 11

Warning: unserialize() [function.unserialize]: Node no longer exists in /opt/lampp/htdocs/test/test.php on line 11

Warning: unserialize() [function.unserialize]: Node no longer exists in /opt/lampp/htdocs/test/test.php on line 11

Warning: unserialize() [function.unserialize]: Node no longer exists in /opt/lampp/htdocs/test/test.php on line 11

Warning: unserialize() [function.unserialize]: Node no longer exists in /opt/lampp/htdocs/test/test.php on line 11

Warning: unserialize() [function.unserialize]: Node no longer exists in /opt/lampp/htdocs/test/test.php on line 11

ToolConfiguration Object
(
    [toolName:private] => test
    [config:private] => SimpleXMLElement Object


Warning:  print_r() [function.print-r]: Node no longer exists in /opt/lampp/htdocs/test/test.php on line 12

        (
        )

    [toolLocation:private] => 
)
Ich hab mal im Netz geforscht und irgendwo gelesen das die Klasse SimpleXMLElement nicht serialisert werden kann. Somit kann ich die Klasse ToolConfiguration nicht serialisieren wie es im obigen Testcode zu sehen ist. Ich habe jedoch auch folgende Funktionen gefunden, welche ein SimpleXMLElement serialisieren und deserialisieren kann:
PHP:
/**
 * Serializes an SimpleXML object
 *
 * @param SimpleXMLElement $xmlObj
 * @return string
 */
function serializeSimpleXML(SimpleXMLElement $xmlObj) 
{
    return serialize($xmlObj->asXML());
}

/**
 * Deserializes an SimpleXML object
 *
 * @param string $str
 * @return SimpleXMLElement
 */
function unserializeSimpleXML($str) 
{
    return simplexml_load_string(unserialize($str));
}
Nun dachte ich mir das ich diese Funktionen benutzen kann um doch die eigene ToolConfiguration Klasse zu serialisieren. Dafür soll es doch die Methoden __sleep() und __wakeup() geben. Das hab ich aber leider nicht hinbekommen. Die Methoden sind wie folgt implementiert:
PHP:
	function __sleep()
	{
		$this->config = serializeSimpleXML($this->config);
		return array('toolName', 'toolLocation', 'config');
	}
	
	function __wakeup()
	{
		$this->config = unserializeSimpleXML($this->config);
	}
Das funktioniert alles wunderbar. Einzige Optimierung ist das weglassen der beiden Funktionen, somit ändern sich __sleep() und __wakeup wie folgt:
PHP:
function __sleep()
	{
		$this->config = $this->config->asXML();
		return array('toolName', 'toolLocation', 'config');
	}
	
	function __wakeup()
	{
		$this->config = simplexml_load_string($this->config);
	}
Dies ist eher ein Informationsthread als Fragethread, da ich beim schreiben dieses Threads auf die Lösung gekommen bin ;)
 
Zuletzt bearbeitet:
Zurück