Как сериализировать / десериализовать объект SimpleXML? - PullRequest
12 голосов
/ 04 июня 2010

Я видел несколько креативных решений для работы с сериализованными объектами 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.] *

Ответы [ 3 ]

31 голосов
/ 04 июня 2010

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

$xml = $simpleXmlElem->asXML();

А потом, когда вы извлекаете его из базы данных:

$simpleXmlElem = simplexml_load_string($xml);

Что касается целесообразности сериализации больших кусков XML, то может быть и так, что размещение XML в базе данных лишает вас преимуществ использования реляционной системы, но у вас есть преимущество, заключающееся в возможности размещения произвольной нагрузка. Если некоторые поля являются универсальными, и / или вы получаете выгоду от их нормализации (например, вы хотите выбрать на основе этих полей), переместите их в нормализованные столбцы.

2 голосов
/ 04 апреля 2014

Более ясно и ООП.

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();
1 голос
/ 04 июня 2010

Разве простой рендеринг и хранение XML не будет лучшим способом сериализации любого объекта, представляющего структуру XML?

Что вы пытаетесь сделать с сериализованными данными, которые могут это предотвратить?

редактирование:

Также

Я храню вложенные сериализованные объекты [...] в базе данных, но позднее они не будут сериализованы

Почему вы храните сериализованные данные PHP в базе данных? Есть много лучших способов хранить объекты в базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...