我不确定为什么会这样。我不序列化XML,但是我从RSS提要创建的数组(注意这只是一个片段):
$game_data = array (
'sysreqos' => $game->systemreq->pc->sysreqos,
'sysreqmhz' => $game->systemreq->pc->sysreqmhz,
'sysreqmem' => $game->systemreq->pc->sysreqmem,
'sysreqdx' => $game->systemreq->pc->sysreqdx,
'sysreqhd' => $game->systemreq->pc->sysreqhd,
);
然后我将其序列化$some_var = serialize($game_data)
并写入文本文件fputs($fh,$some_var)
。
但它没有那么远,它在序列化行上出错:
不允许异常'异常',并且不允许'序列化'SimpleXMLElement'消息'
答案 0 :(得分:25)
您必须将XML数据转换为字符串,因为在内部它们都是SimpleXMLElement
s。
$game_data = array (
'sysreqos' => (string)$game->systemreq->pc->sysreqos,
'sysreqmhz' => (string)$game->systemreq->pc->sysreqmhz,
'sysreqmem' => (string)$game->systemreq->pc->sysreqmem,
'sysreqdx' => (string)$game->systemreq->pc->sysreqdx,
'sysreqhd' => (string)$game->systemreq->pc->sysreqhd
);
或许更优雅一点:
$game_data = array();
$properties = array('sysreqos', 'sysreqmhz', 'sysreqmem', 'sysreqdx', 'sysreqhd');
foreach ($properties as $p) {
$game_data[$p] = (string)$game->systemreq->pc->$p;
}
答案 1 :(得分:8)
在“类和对象”文档中,有以下内容:为了能够反序列化()对象,需要定义该对象的类。
在PHP 5.3之前,这不是问题。但是在PHP 5.3之后,SimpleXML_Load_String()生成的对象无法序列化。尝试这样做会导致运行时失败,抛出异常。如果将这样的对象存储在$ _SESSION中,则会出现执行后错误:
致命错误:在[无活动文件]中不允许使用消息'序列化'SimpleXMLElement'的未捕获异常'异常':0堆栈跟踪:#0 {main}在第0行的[no active file]中抛出< / p>
会话的全部内容都将丢失。希望这能节省一些时间!
<?php // RAY_temp_ser.php
error_reporting(E_ALL);
session_start();
var_dump($_SESSION);
$_SESSION['hello'] = 'World';
var_dump($_SESSION);
// AN XML STRING FOR TEST DATA
$xml = '<?xml version="1.0"?>
<families>
<parent>
<child index="1" value="Category 1">Child One</child>
</parent>
</families>';
// MAKE AN OBJECT (GIVES SimpleXMLElement)
$obj = SimpleXML_Load_String($xml);
// STORE THE OBJECT IN THE SESSION
$_SESSION['obj'] = $obj;
作者:Ray.Paseur
我所做的就像'Stefan Gehrig'所说,将XML数据转换为字符串
$_SESSION['obj'] = (string)$obj;