如何序列化/反序列化SimpleXML对象?

时间:2010-06-04 01:30:28

标签: php serialization object

我已经看到了一些用于处理序列化SPL对象的creative solutions,但我正在寻找更多选项(或详细说明)。我将嵌套的序列化对象(其中一个是SimpleXML)存储在数据库中,以后才能进行非序列化。这显然会引起一些问题。

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

有没有人对处理序列化SPL对象的高可靠性方法有任何见解? __sleep()/ __ wakeup()覆盖?铸造到stdClass的? Cast-to-string,然后序列化?

感谢任何帮助。

[编辑:这些XML模式的范围和变体太多,无法使用ORM进行映射。它们在最基本的层面上是有状态进程中的任意有效载荷,在宁静的API中触发。]

3 个答案:

答案 0 :(得分:31)

尽管有关于适当性的问题,但您可以将其转换回XML:

$xml = $simpleXmlElem->asXML();

然后,当你从数据库中提取它时:

$simpleXmlElem = simplexml_load_string($xml);

至于是否适合序列化大块的XML,将XML放入数据库可以消除使用关系系统的大部分优势,但是你确实具有能够容纳任意关系的优势工作量。如果某些字段是通用的,并且/或者您从正确规范化它们中获益(例如,您希望根据这些字段进行选择),请将它们移动到标准化列中。

答案 1 :(得分:2)

更明确和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);
    }

}

并致电

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

答案 2 :(得分:1)

不是简单地呈现和存储XML是序列化表示XML结构的任何对象的最佳方式吗?

您打算如何处理可能会阻止此操作的序列化数据?

编辑:

另外,

  

我将嵌套的序列化对象[...]存储在数据库中,以后才能进行非序列化

为什么要将PHP序列化数据存储在数据库中?有许多更好的方法可以在数据库中存储对象。

相关问题