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:
Bei folgendem Testcode:
kommt folgende Warnung:
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:
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:
Das funktioniert alles wunderbar. Einzige Optimierung ist das weglassen der beiden Funktionen, somit ändern sich __sleep() und __wakeup wie folgt:
Dies ist eher ein Informationsthread als Fragethread, da ich beim schreiben dieses Threads auf die Lösung gekommen bin
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);
}
}
?>
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';
}
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] =>
)
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));
}
PHP:
function __sleep()
{
$this->config = serializeSimpleXML($this->config);
return array('toolName', 'toolLocation', 'config');
}
function __wakeup()
{
$this->config = unserializeSimpleXML($this->config);
}
PHP:
function __sleep()
{
$this->config = $this->config->asXML();
return array('toolName', 'toolLocation', 'config');
}
function __wakeup()
{
$this->config = simplexml_load_string($this->config);
}
Zuletzt bearbeitet: