未被捕获的异常'异常',消息'序列化'SimpleXMLElement'不允许'

时间:2011-05-19 12:56:22

标签: php exception serialization simplexml

我不确定为什么会这样。我序列化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'消息'

2 个答案:

答案 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

参考:http://php.net/manual/en/function.unserialize.php

我所做的就像'Stefan Gehrig'所说,将XML数据转换为字符串

$_SESSION['obj'] = (string)$obj;