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

use*_*088 9 php serialization exception 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,
);
Run Code Online (Sandbox Code Playgroud)

然后我序列化它$some_var = serialize($game_data)并写入文本文件fputs($fh,$some_var).

但它没有那么远,它在序列化行上出错:

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

Ste*_*rig 25

您必须将XML数据转换为字符串,因为它们都是内部SimpleXMLElement的.

$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
            );
Run Code Online (Sandbox Code Playgroud)

或者更优雅一点:

$game_data  = array();
$properties = array('sysreqos', 'sysreqmhz', 'sysreqmem', 'sysreqdx', 'sysreqhd');
foreach ($properties as $p) {
    $game_data[$p] = (string)$game->systemreq->pc->$p;
}
Run Code Online (Sandbox Code Playgroud)


abd*_*ood 8

在类和对象文档中,有这样的:为了能够反序列化()一个对象,需要定义该对象的类.

在PHP 5.3之前,这不是问题.但是在PHP 5.3之后,SimpleXML_Load_String()生成的对象无法序列化.尝试这样做会导致运行时失败,抛出异常.如果在$ _SESSION中存储这样的对象,则会出现执行后错误,说明:

致命错误:在[无活动文件]中不允许出现"异常"消息"序列化''SimpleXMLElement':0堆栈跟踪:#0 {main}在第0行的[无活动文件]中抛出

会话的全部内容都将丢失.希望这能节省一些时间!

<?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;
Run Code Online (Sandbox Code Playgroud)

作者:Ray.Paseur

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

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

$_SESSION['obj'] = (string)$obj;
Run Code Online (Sandbox Code Playgroud)