我遇到了一个奇怪的问题,如果我尝试序列化同一个类的对象数组,其中该类已实现Serializable接口,并且在serializable接口中返回另一个类的序列化实例,数组项在第一对夫妇被认为是递归之后。
这是一个测试用例:
<?php
class HelloWorld implements Serializable {
public $test;
public function __construct($str)
{
$this->test = $str;
}
public function serialize()
{
$simple = null;
$simple = new Simple();
$simple->test = $this->test;
return serialize($simple);
}
public function unserialize($str)
{
$simple = unserialize($str);
$this->test = $simple->test;
}
}
class Simple
{
public $test;
}
$list = array(
new HelloWorld('str1'),
new HelloWorld('str2'),
new HelloWorld('str3'),
new HelloWorld('str4'),
new HelloWorld('str5'),
new HelloWorld('str6'),
new HelloWorld('str7'),
new HelloWorld('str8'),
new HelloWorld('str9'),
);
$str = serialize($list);
echo $str . "\n";
// var_dump(unserialize($str));
取消注释最后一行并享受php分段错误。
有谁知道这是为什么或如何修复它?如果HelloWorld::serialize()
中序列化的内容是数组或原始值,则这似乎不是问题。
更新
以下是上述代码的输出:
a:9:{i:0;C:10:"HelloWorld":39:{O:6:"Simple":1:{s:4:"test";s:4:"str1";}}i:1;C:10:"HelloWorld":4:{r:3;}i:2;C:10:"HelloWorld":4:{r:3;}i:3;C:10:"HelloWorld":4:{r:3;}i:4;C:10:"HelloWorld":4:{r:3;}i:5;C:10:"HelloWorld":4:{r:3;}i:6;C:10:"HelloWorld":4:{r:3;}i:7;C:10:"HelloWorld":4:{r:3;}i:8;C:10:"HelloWorld":4:{r:3;}}
问题是第二个及以下记录中的r:4;
内容。
答案 0 :(得分:1)
该死!对不起,我读错了你的问题。以为你想打印所有这些。
您需要简单的可序列化。否则它将无法工作,为了序列化你需要使用这样的东西:
class HelloWorld implements Serializable
{
public $test;
public function __construct($str)
{
$this->test = $str;
}
public function serialize()
{
return serialize($this->test);
}
public function unserialize($str)
{
$simple = unserialize($str);
$this->test = $simple;
}
}
不需要简单的课程。请记住,$ this-&gt;数据必须始终可序列化。