2010-06-04 28 views
11

Ho visto alcuni creative solutions per il trattamento di oggetti SPL serializzati ma sto cercando altre opzioni (o elaborazioni). Conservo oggetti serializzati nidificati - di cui, uno è SimpleXML - nel database, solo per non essere serializzato più tardi. Questo ovviamente causa alcuni problemi.Come serializzare/non serializzare un oggetto SimpleXML?

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

Qualcuno ha qualche idea dei metodi altamente affidabili per gestire gli oggetti SPL serializzati? __sleep()/__ wakeup() esegue l'override? Cast-to-stdClass? Cast-to-string, quindi serializzare?

Qualsiasi aiuto è apprezzato.

[Modifica: l'ambito e la variazione di questi schemi XML sono troppo diversi per mappare con un ORM. Sono, al loro livello più fondamentale, carichi arbitrari in processi di stato, attivati ​​all'interno di API riposanti.]

risposta

29

Domande sulla nonostante appropriatezza, è possibile trasformarlo di nuovo in XML come questo:

$xml = $simpleXmlElem->asXML(); 

E poi, quando si tira dal database:

$simpleXmlElem = simplexml_load_string($xml); 

Per quanto riguarda se è giusto serializzare grandi blocchi di XML, può essere vero che mettere XML nel database rimuove gran parte del vantaggio dell'uso di un sistema relazionale, ma hai il vantaggio di essere in grado per ospitare un carico di lavoro arbitrario. Se alcuni campi sono universali e/o ottieni benefici dalla loro normalizzazione (ad es. Vuoi selezionare in base a quei campi), sposta quelli in colonne normalizzate.

+3

La domanda più importante nella mia mente è perché PHP non lo fa automaticamente? C'è una seria penalità nella serializzazione/deserializzazione degli oggetti xml in PHP? – devios1

1

Non sarebbe semplicemente il rendering e la memorizzazione dell'XML essere il modo migliore per serializzare qualsiasi oggetto che rappresenta una struttura XML?

Che cosa stai cercando di fare con i dati serializzati che potrebbero impedirlo?

edit:

Inoltre,

ho memorizzare oggetti serializzati nidificati [...] nel database, solo per essere un-serializzato dopo

Perché sei memorizzare dati serializzati PHP in un database? Esistono molti modi migliori per archiviare oggetti in un database.

+1

"Perché la memorizzazione dei dati di PHP serializzato in un database?" Per memorizzare lo stato di processi dinamici piuttosto grandi. "Non sarebbe semplicemente il rendering e la memorizzazione dell'XML come il modo migliore per serializzare qualsiasi oggetto che rappresenta una struttura XML?" Possibilmente. Questa è stata la domanda che ho posto. – allnightgrocery

+0

"Esistono molti modi migliori per archiviare gli oggetti." Vorresti approfondire su questo punto? – allnightgrocery

+1

Sicuro. Prova a mappare ogni proprietà in un oggetto a una colonna in una tabella.Se la proprietà è essa stessa un oggetto, quell'oggetto deve essere memorizzato in un'altra tabella e può essere referenziato in parent usando una chiave esterna. Questo è normalmente chiamato "mappatura relazionale dell'oggetto" e può diventare un po 'complesso. Se stai usando un database di valori-chiave o di documenti, le cose sono ovviamente diverse ... – Charles

2

Più chiaro e 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); 
    } 

} 

e chiamando

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