【问题标题】:How-to Serialize/Unserialize a SimpleXML Object?如何序列化/反序列化 SimpleXML 对象?
【发布时间】: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 中触发。]

【问题讨论】:

    标签: php serialization object


    【解决方案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 并将其粘贴到表中。
      猜你喜欢
      • 1970-01-01
      • 2012-04-13
      • 2015-06-28
      • 2011-04-06
      • 1970-01-01
      • 1970-01-01
      • 2012-04-15
      • 1970-01-01
      相关资源
      最近更新 更多