开发者

How-to Serialize/Unserialize a SimpleXML Object?

开发者 https://www.devze.com 2023-01-01 23:58 出处:网络
I\'ve seen a few creative solutions for dealing with serialized SPL objects but am looking for more options (or elaborations). I store nested serialized objects - of which, one is SimpleXML - in the d

I've seen a few creative solutions for dealing with serialized SPL objects but am looking for more options (or elaborations). I store nested serialized objects - of which, one is SimpleXML - in the database, only to be un-serialized later. This obviously cause some problems.

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

Does anyone have any insight into highly-reliable methods for dealing with serialized SPL objects? __sleep()/__wakeup() overrides? Cast-to-stdClass? Cast-to-string, then serialize?

Any help is app开发者_开发百科reciated.

[Edit: The scope and variation of these XML schemas are too varied to map with an ORM. They are, at their most fundamental level, arbitrary payloads in stateful processes, triggered within restful APIs.]


Questions on appropriateness notwithstanding, you can turn it back into XML like this:

$xml = $simpleXmlElem->asXML();

And then, when you pull it from the database:

$simpleXmlElem = simplexml_load_string($xml);

As for whether it's appropriate to just serialize large chunks of XML, it can be true that putting XML into the database removes much of the advantage of using a relational system, but you do have the advantage of being able to accommodate an arbitrary workload. If some fields are universal, and/or you gain benefit from normalizing them properly (e.g. you want to select based on those fields), move those into normalized columns.


More clear and 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);
    }

}

and calling

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


Wouldn't simply rendering and storing the XML be the best way to serialize any object that represents an XML structure?

What are you trying to do with the serialized data that might prevent this?

edit:

Also,

I store nested serialized objects [...] in the database, only to be un-serialized later

Why are you storing PHP serialized data in a database? There are many better ways to store objects in a database.

0

精彩评论

暂无评论...
验证码 换一张
取 消