问题描述
我试图反序列化一个 PHP 对象.
I have tried to unserialize a PHP Object.
警告:unserialize() [function.unserialize]:第 42 行的/var/www/app.php 中不再存在节点
但是为什么会发生这种情况?
即使我找到了反序列化 simplexml 对象的解决方案,知道为什么 php 不能反序列化对象也很好?
Even if I found a solution to unserialize simplexml objects, its good to know why php cant unserialize objects?
为了序列化 simplexml 对象,我使用这个函数
function serializeSimpleXML(SimpleXMLElement $xmlObj)
{
return serialize($xmlObj->asXML());
}
为了反序列化一个 simplexml objetc 我使用这个函数
function unserializeSimpleXML($str)
{
return simplexml_load_string(unserialize($str));
}
推荐答案
SimpleXMLElement 包装了一个 libxml 资源类型.资源无法序列化.在下一次调用时,表示 libxml Node 对象的资源不存在,因此反序列化失败.这可能是一个错误,您完全可以序列化 SimpleXMLElement.
SimpleXMLElement wraps a libxml resource type. Resources cannot be serialized. On the next invocation, the resource representing the libxml Node object doesn't exist, so unserialization fails. It may be a bug that you are allowed to serialize a SimpleXMLElement at all.
您的解决方案是正确的,因为 text/xml 是任何 XML 的正确序列化格式.但是,由于它只是一个字符串,因此实际上没有任何理由序列化 XML 字符串本身.
Your solution is the correct one, since text/xml is the correct serialization format for anything XML. However, since it is just a string, there isn't really any reason to serialize the XML string itself.
请注意,这与内置"PHP 类/对象本质上没有任何关系,而是 SimpleXML(我认为是 PHP 5 中的 DOM)的一个实现细节.
Note that this has nothing inherently to do with "built-in" PHP classes/objects, but is an implementation detail of SimpleXML (and I think DOM in PHP 5).
这篇关于为什么无法序列化 PHP 内置对象?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!