How-to Serialize/Unserialize объекта SimpleXML?

Я видел несколько креативных решений для работы с сериализованными объектами 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() переопределяет? Монолитные к StdClass? Вставить в строку, затем сериализовать?

Любая помощь приветствуется.

[ Изменить: масштаб и вариация этих XML-схем слишком разнообразны для сопоставления с ORM. На самом фундаментальном уровне они представляют собой произвольные полезные нагрузки в процессах, связанных с состоянием, которые запускаются в поддерживающих API.]

Ответ 1

Несмотря на вопросы о целесообразности, вы можете включить его в XML следующим образом:

$xml = $simpleXmlElem->asXML();

И затем, когда вы вытащите его из базы данных:

$simpleXmlElem = simplexml_load_string($xml);

Что касается того, целесообразно ли просто сериализовывать большие куски XML, может оказаться правдой, что помещение 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 в базе данных? Существует множество способов хранения объектов в базе данных.