如何序列化/反序列化 SimpleXML 对象?
Posted
技术标签:
【中文标题】如何序列化/反序列化 SimpleXML 对象?【英文标题】:How-to Serialize/Unserialize a SimpleXML Object? 【发布时间】:2011-02-27 14:18:09 【问题描述】:我见过一些creative solutions 用于处理序列化的 SPL 对象,但我正在寻找更多选项(或详细说明)。我将嵌套的序列化对象(其中一个是 SimpleXML)存储在数据库中,以便稍后取消序列化。这显然会导致一些问题。
$s = new SimpleXmlElement('<foo>bar</foo>');
$ss = serialize($s);
$su = unserialize($ss);
// Warning: unserialize() [function.unserialize]: Node no longer exists...
是否有人对处理序列化 SPL 对象的高度可靠方法有任何见解? __sleep()/__wakeup() 覆盖? Cast-to-stdClass?转换成字符串,然后序列化?
感谢任何帮助。
[编辑:这些 XML 模式的范围和变化太多,无法使用 ORM 进行映射。在最基本的层面上,它们是有状态进程中的任意有效负载,在 RESTful API 中触发。]
【问题讨论】:
【参考方案1】:尽管有关于适当性的问题,您可以像这样将其转回 XML:
$xml = $simpleXmlElem->asXML();
然后,当你从数据库中提取它时:
$simpleXmlElem = simplexml_load_string($xml);
至于仅序列化大块 XML 是否合适,将 XML 放入数据库确实消除了使用关系系统的大部分优势,但您确实具有能够容纳任意工作量。如果某些字段是通用的,并且/或者您从正确规范化它们中受益(例如,您想根据这些字段进行选择),请将它们移到规范化列中。
【讨论】:
我心中更大的问题是为什么 php 不自动执行此操作?在 PHP 中序列化/反序列化 xml 对象是否有严重的惩罚?【参考方案2】:更加清晰和面向对象。
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();
【讨论】:
【参考方案3】:简单地呈现和存储 XML 不是序列化任何表示 XML 结构的对象的最佳方式吗?
您想对可能阻止这种情况的序列化数据做什么?
编辑:
还有,
我将嵌套的序列化对象 [...] 存储在数据库中,只是稍后会取消序列化
为什么要将 PHP 序列化数据存储在数据库中?有许多更好的方法可以将对象存储在数据库中。
【讨论】:
"为什么要将 PHP 序列化数据存储在数据库中?"用于存储相当大的动态过程的状态。 “简单地呈现和存储 XML 不是序列化任何表示 XML 结构的对象的最佳方式吗?”可能。这就是我提出的问题。 “有很多更好的方法来存储对象。”您愿意详细说明这一点吗? 当然。尝试将对象中的每个属性映射到表中的列。如果属性本身是一个对象,则该对象需要存储在另一个表中,并且可以使用外键在父级中引用。这通常称为“对象-关系映射”,并且可能会变得有点复杂。如果您使用的是键值或文档数据库,那么情况当然会有所不同... 当然,ORM。我们有一个完整的核心元素 ORM 模式,但更复杂的元素是这些过程(n 长度和 100% 动态)。几乎不可能限定一个 ORM 模式来处理大量的对象、变化和状态变化。虽然,这对我们的核心模型是绝对必要的。看到坚实的结构进入关于设计的对话总是很高兴。 如果它至少结构良好,也许像文档数据库这样的东西更适合存储和检索,而不是仅仅将其序列化为 blob 并将其粘贴到表中。以上是关于如何序列化/反序列化 SimpleXML 对象?的主要内容,如果未能解决你的问题,请参考以下文章