我正在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()
,我就会按预期获得该项目。在已经序列化的对象中,是否有某些预防措施与公共函数一起使用?
答案 0 :(得分:0)
你可能混合/切换了这个:
在您的代码中,您正在序列化$data
数组,而不是“您的对象”。我不完全确定这一点,因为我不知道insert()
函数的用途。
但是对于serializable
interface对象中的序列化,您将获得从object::serialize()
返回的内容。
在序列化数组时,您将获得序列化数组。后台的PHP小心将它存储为您的对象。