Я видел несколько креативных решений для работы с сериализованными объектами 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.]
Несмотря на вопросы о целесообразности, вы можете включить его в XML следующим образом:
$xml = $simpleXmlElem->asXML();
И затем, когда вы вытащите его из базы данных:
$simpleXmlElem = simplexml_load_string($xml);
Что касается того, целесообразно ли просто сериализовывать большие куски XML, может быть, что размещение XML в базе данных удаляет большую часть преимуществ использования реляционной системы, но у вас есть преимущество в том, что вы можете разместить произвольную рабочую нагрузку. Если некоторые поля универсальны и / или вы получаете выгоду от нормализации их должным образом (например, вы хотите выбрать на основе этих полей), переместите их в нормализованные столбцы.
Более ясный и ООП.
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();
Разве простое рендеринг и хранение XML не будет лучшим способом сериализации любого объекта, представляющего структуру XML?
Что вы пытаетесь сделать с сериализованными данными, которые могут помешать этому?
редактировать:
Также,
Я храню вложенные сериализованные объекты […] в базе данных, только для последующего сериализации
Почему вы храните сериализованные данные PHP в базе данных? Существует множество способов хранения объектов в базе данных.