为什么不可能序列化PHP内置对象?

时间:2010-01-02 21:23:15

标签: php object serialization

我试图反序列化一个PHP对象。

警告:unserialize()[function.unserialize]:第42行/var/www/app.php中不再存在节点

为什么会发生这种情况?

即使我找到了反序列化simplexml对象的解决方案,也很清楚为什么php无法反序列化对象?

要序列化simplexml对象,请使用此功能

function serializeSimpleXML(SimpleXMLElement $xmlObj) 
{

        return serialize($xmlObj->asXML());

}

要反序列化simplexml对象我使用此功能

function unserializeSimpleXML($str) 
{

        return simplexml_load_string(unserialize($str));

}

2 个答案:

答案 0 :(得分:12)

SimpleXMLElement包装libxml资源类型。资源无法序列化。在下一次调用时,表示libxml Node对象的资源不存在,因此反序列化失败。可能是一个允许您完全序列化SimpleXMLElement的错误。

您的解决方案是正确的,因为text / xml是任何XML的正确序列化格式。但是,由于它只是一个字符串,因此没有任何理由将XML字符串本身序列化。

请注意,这与“内置”PHP类/对象没有任何关系,但它是SimpleXML的实现细节(我认为PHP 5中的DOM)。

答案 1 :(得分:2)

只是固有的类(主要的xml类最好)在另一个

并使用__sleep 存储初始化simplexml(任何对象)所需的数据

和__wake 根据需要重新初始化对象

这样你可以序列化(任何对象)

编辑:记住这个类需要先访问, 这可以通过加载(包括)类或__autoload

来完成