用指向其他对象的指针数组安全地序列化对象


Safely serialize objects with arrays of pointers to other objects

对于我工作的PHP项目,我有一个对象(实际上是一个单例,但这不是非常重要,我知道我需要为静态值做一个特殊的情况)。该对象包含受保护的数组,每个数组都有指向10到30个其他对象的指针。

在保持所有相关引用和索引(这是大多数数组)的同时,序列化(也反序列化)整个数据结构的最简单方法是什么?

程序处理由对象表示的卡片,这些对象由包(也是对象)收集,并注册到一个名为box的对象。包也注册到box(通过引用传递对象),box维护两者的索引。Box执行各种操作(例如从每个包中随机获得一张牌并将其添加到另一个数组中(作为指针),并创建一个称为索引的镜像数组(较少这些牌),并进行洗牌。然后在对象玩家的实例之间"发牌"(这也可能与box注册)。

认为我可以简单地序列化box,一切都会很好,但我强烈怀疑这一点。我怎么能确保所有的引用(指针数组)是完整的和正确的(而不是对象的副本)后,对象的混乱已经成为一个字符串,又回到了对象?

  1. 我试图简单地用序列化转储盒子,得到

类pack的对象无法在/path/to/box.class.php中转换为int

老实说,那正是我所期望的。因此,我的问题是我如何去做这件事。

也许我沟通不好?也许一些代码会使这更清楚。

请注意我们有多少引用存储空间。如何实现Serializable接口来解决这个问题?

<?php
class box{
    public $cards = array();
    public $index = array();
    protected $solution = array();
    public $packs = array();
    public function shuffle(){
        if(count($this->index==0)){
            $this->index = $this->cards;
        }
        shuffle($this->index);
    }
    public function set_up(){
        $this->index = $this->cards;
        foreach($this->packs as $pack){
            $card=$pack->chooseAtRandom();
            unset($this->index[$card->getID()]);
            $this->solution[]&=$card;
        }
        $this->shuffle();
    }
    public function registerPackToBox(&$pack){
        $this->packs[] &= $pack;
        return (count($this->packs)-1);
    }
    public function registerCardToBox(&$card){
        $this->cards[] &= $card;
        return (count($this->cards)-1);
    }
    // ... other stuff ...
}

通过查看文档,$_SESSION将自动为您序列化和存储对象。

示例:http://example.preinheimer.com/sessobj.php