如何序列化/反序列化 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 对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何序列化和反序列化 JavaScript 对象?

如何使用 Jackson 反序列化来自 json 对象的对象数组

使用 gson 反序列化反序列化对象的内部对象

我该如何正确地反序列化这个对象?

如何反序列化具有可序列化对象数组的类

如何解决这些问题? “无法反序列化对象。”