使用PHP中的自定义项序列化优先级队列

时间:2011-06-22 08:53:06

标签: php zend-framework serialization php-5.3 priority-queue

我正在Zend应用程序中基于PHP的SPLPriorityQueue实现自定义优先级队列。它包含自定义对象PriorityQueueItens,而不是除了优先级值之外的纯值。在APC(或memcache)中存储队列时,我必须确保队列及其项目是可序列化的,因此我将它们设置为实现即将发布的Zend Framework 2中的Serializable接口using code

public function serialize()
{
    $data = array();
    while ($this->valid()) {
        $data[] = $this->current();
        $this->next();
    }
    foreach ($data as $item) {
        $this->insert($item['data'], $item['priority']);
    }
    return serialize($data);
}

public function unserialize($data)
{
    foreach (unserialize($data) as $item) {
        $this->insert($item['data'], $item['priority']);
    }
}

从APC获取队列并使用$this->extract()检索优先级队列中的顶级项目后,我没有获得该项目,而是获取序列化期间创建的数组。

因此,我使用了存储在队列中的对象的基类而不是PriorityQueueItem,而是获得了一个带有索引 data priority 的关联数组(类似于serialize函数中的数组)。要获取实际项目,我需要检索数组的 data 部分,而不是将返回的项目视为项目,这是在不将队列存储在APC中时的工作原理以及我如何假设现在也在工作。

这是对象序列化的特征还是我以错误的方式接近它?

更新:这里的问题是我有一个单独的功能,除了extract()之外还有额外的功能。此函数将项目作为数组返回,但只要我明确调用extract(),我就会按预期获得该项目。在已经序列化的对象中,是否有某些预防措施与公共函数一起使用?

1 个答案:

答案 0 :(得分:0)

你可能混合/切换了这个:

在您的代码中,您正在序列化$data数组,而不是“您的对象”。我不完全确定这一点,因为我不知道insert()函数的用途。

但是对于serializable interface对象中的序列化,您将获得从object::serialize()返回的内容。

在序列化数组时,您将获得序列化数组。后台的PHP小心将它存储为您的对象。