2010-06-04 20 views
11

He visto algunos creative solutions para tratar objetos serializados SPL pero estoy buscando más opciones (o elaboraciones). Guardo objetos serializados anidados, de los cuales, uno es SimpleXML, en la base de datos, para luego ser sin serializar. Esto obviamente causa algunos problemas.¿Cómo serializar/deserializar un objeto SimpleXML?

$s = new SimpleXmlElement('<foo>bar</foo>'); 
$ss = serialize($s); 
$su = unserialize($ss); 
// Warning: unserialize() [function.unserialize]: Node no longer exists... 

¿Alguien tiene alguna idea de métodos altamente fiables para tratar con objetos serializados SPL? __sleep()/__ wakeup() anula? Cast-to-stdClass? Cast-to-string, luego serialize?

Cualquier ayuda es apreciada.

[Editar: El alcance y la variación de estos esquemas XML son demasiado variados para correlacionar con un ORM. Son, en su nivel más fundamental, cargas útiles arbitrarias en procesos con estado, desencadenados en API silenciosas.]

Respuesta

29

Preguntas sobre pesar de conveniencia, se puede convertir de nuevo en XML como esto:

$xml = $simpleXmlElem->asXML(); 

Y luego, cuando se tire de ella desde la base de datos:

$simpleXmlElem = simplexml_load_string($xml); 

En cuanto a si es apropiado simplemente serializar grandes porciones de XML, puede ser cierto que poner XML en la base de datos elimina gran parte de la ventaja de usar un sistema relacional, pero usted tiene la ventaja de poder para acomodar una carga de trabajo arbitraria. Si algunos campos son universales y/o obtiene beneficios al normalizarlos adecuadamente (por ejemplo, si desea seleccionar en función de esos campos), muévalos a las columnas normalizadas.

+3

La pregunta más importante en mi mente es ¿por qué PHP no hace esto automáticamente? ¿Existe una penalización seria al serializar/deserializar objetos xml en PHP? – devios1

1

¿No sería simplemente la representación y el almacenamiento del XML la mejor manera de serializar cualquier objeto que represente una estructura XML?

¿Qué intenta hacer con los datos serializados que pueden evitar esto?

edición:

Además,

almaceno objetos serializados anidadas [...] en la base de datos, sólo para ser des-serializado tarde

¿Por qué estás ¿almacena datos serializados de PHP en una base de datos? Hay muchas formas mejores de almacenar objetos en una base de datos.

+1

"¿Por qué almacenar datos PHP serializado en una base de datos?" Para almacenar el estado de procesos dinámicos bastante grandes. "¿No sería simplemente renderizar y almacenar el XML la mejor manera de serializar cualquier objeto que represente una estructura XML?" Posiblemente. Esa fue la pregunta que planteé. – allnightgrocery

+0

"Hay muchas formas mejores de almacenar objetos". ¿Te gustaría elaborar sobre este punto? – allnightgrocery

+1

Claro. Intente asignar cada propiedad de un objeto a una columna en una tabla.Si la propiedad es en sí misma un objeto, ese objeto debe almacenarse en otra tabla y se puede hacer referencia en el elemento primario con una clave externa. Esto normalmente se llama "mapeo relacional de objetos" y puede ser complejo. Si está utilizando una clave-valor o una base de datos de documentos, las cosas son diferentes, por supuesto ... – Charles

2

Más claro y OOP.

namespace MyApp; 
class SimpleXMLElement extends \SimpleXMLElement 
{ 
    public function arrayToXml($array = array()) 
    { 
     array_walk_recursive($array, array(&$this, 'addChildInverted')); 
     return $this; 
    } 

    public function addChildInverted($name ,$value) 
    { 
     parent::addChild($value,$name); 
    } 

} 

y llamando

$xml = new \MyApp\SimpleXMLElement('<resultado/>'); 
    echo $xml->arrayToXml($app->getReturnedValue())->asXML(); 
Cuestiones relacionadas