2010-06-04 2 views
11

Я видел несколько creative solutions для работы с сериализованными объектами SPL, но я ищу больше вариантов (или разработок). Я храню вложенные сериализованные объекты - из которых один - SimpleXML - в базе данных, только для последующей сериализации. Это, очевидно, вызывает некоторые проблемы.How-Serialize/Unserialize объекта 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.]

ответ

29

Вопросы по уместности несмотря на это, вы можете превратить его обратно в XML, как это:

$xml = $simpleXmlElem->asXML(); 

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

$simpleXmlElem = simplexml_load_string($xml); 

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

+3

Больший вопрос, на мой взгляд, почему PHP не делает это автоматически? Есть ли серьезный штраф в сериализации/десериализации объектов xml в PHP? – devios1

1

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

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

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

Кроме того,

хранить вложенные сериализованные объекты [...] в базе данных, только чтобы быть не-сериализовать позже

Почему ты хранения сериализованных данных PHP в базе данных? Существует множество способов хранения объектов в базе данных.

+1

"Почему вы хранение PHP сериализовать данные в базе данных?" Для хранения состояния довольно больших динамических процессов. «Разве простое рендеринг и хранение XML не будет лучшим способом сериализации любого объекта, представляющего структуру XML?» Возможно. Это был вопрос, который я задал. – allnightgrocery

+0

«Есть много способов хранения объектов». Не могли бы вы рассказать об этом? – allnightgrocery

+1

Конечно. Попробуйте сопоставить каждое свойство в объекте с столбцом в таблице.Если свойство само по себе является объектом, этот объект должен храниться в другой таблице и может быть указан в родителе с использованием внешнего ключа. Обычно это называется «объектно-реляционным отображением» и может иметь вид сложного. Если вы используете базу данных ключа или документа, все будет по-другому ... – Charles

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(); 
Смежные вопросы