【问题标题】:Safely serialize objects with arrays of pointers to other objects使用指向其他对象的指针数组安全地序列化对象
【发布时间】:2015-08-25 14:18:20
【问题描述】:

对于我正在处理的 PHP 项目,我有一个对象(实际上是一个单例,但这并不是非常重要,我知道我需要为静态值创建一个特殊情况)。该对象包含受保护的数组,每个数组都有指向十到三十个其他对象的指针。

在维护所有相关引用和索引(大多数数组都是如此)的同时序列化(以及反序列化)整个数据结构的最简单方法是什么?

详情

该程序处理每张由对象表示的卡片,这些对象由包(也是对象)收集并注册到一个称为盒子的对象。包还注册到盒子(通过引用传递对象),该盒子维护两者的索引。 Box执行各种操作(例如从每个包中获取一张随机卡片并将其添加到另一个数组(作为指针)并创建一个称为索引的镜像数组(减去这些卡片),它会洗牌。然后卡片在实例之间“处理”对象播放器(也可能会注册到盒子)。

很高兴认为我可以简单地对 box 进行序列化,一切都会好起来的,但我强烈怀疑这一点。在乱七八糟的对象变成字符串并再次成为对象后,如何确保所有引用(指针数组)都是完整且正确的(而不是对象的副本)?

更新

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

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

说实话,这正是我所期望的。因此,我的问题是关于我如何做到这一点。

  1. 也许我沟通不畅?也许一些代码会让这更清楚。

请注意我们正在进行的参考存储量。我该如何实现 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 ...

}

【问题讨论】:

  • 你能不能只为卡编写自己的序列化函数,然后为包编写一个序列化函数(在每张卡上调用序列化)等,直到你编写了最终的序列化框方法?将对象转换为字符串的目的还在于使其对人眼可读。为什么需要将字符串反序列化为对象?无论如何,您可能会发现这些信息。 community.sitepoint.com/t/object-equivalence-after-serialize/…
  • 计划是在会话中持久化对象。我要么序列化对象,要么存储数据并重建对象,这似乎是在重新发明轮子。
  • 这可能会有所帮助。 stackoverflow.com/questions/1442177/…。我刚刚看了看,上面写着“对象会自动序列化为 $_SESSION,因此不需要显式序列化”
  • 问题是关于确保对象可以被序列化。

标签: php arrays pointers serialization


【解决方案1】:

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

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

【讨论】:

  • 假设对象可以是...但是这些对象包含指向其他对象的指针。
  • 您是否尝试将其存储在会话中?我不明白为什么 php 不会为你处理低级指针细节。
  • 问题是预期的(现在证明是)子对象及其指针。 PHP 尝试将它们转换为整数,但未能成功。请参阅更新 #1。
  • 那么可以肯定地说,您放入会话的对象不会被序列化,并且不会正确反序列化。由于 http 是无状态的,因此您无能为力。您将无法像以前那样正确获取所有状态,这是一种保证。所以你必须自己手动序列化它并做你想做的事情(把它放在会话中,或者序列化为 json 并存储在一个 cookie 中)。
猜你喜欢
  • 2013-09-25
  • 1970-01-01
  • 2013-06-30
  • 2014-03-14
  • 1970-01-01
  • 2014-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多