Я не знаю, почему это происходит. Я не сериализую 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 »не допускается»
Вы должны SimpleXMLElement
данные 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; }
В документах классов и объектов есть следующее: Чтобы иметь возможность unserialize () объекта, должен быть определен класс этого объекта.
До 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;
Автор: Ray.Paseur
что я делаю, так как «Стефан Гериг» сказал, передал данные XML в строку
$_SESSION['obj'] = (string)$obj;