我已经看到了一些用于处理序列化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中触发。]
答案 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序列化数据存储在数据库中?有许多更好的方法可以在数据库中存储对象。