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 в базе данных? Существует множество способов хранения объектов в базе данных.