Сериализация очереди приоритетов с пользовательскими элементами в PHP - PullRequest
0 голосов
/ 22 июня 2011

Я реализую настроенную очередь приоритетов на основе PHP SPLPriorityQueue в приложении Zend.Он содержит пользовательские объекты PriorityQueueItens вместо чистых значений помимо значения приоритета.При хранении очереди в APC (или memcache) я должен убедиться, что очередь и ее элементы сериализуемы, поэтому я настроил их для реализации интерфейса Serializable с использованием кода из будущей Zend Framework 2.

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 (аналогично массиву в функции сериализации).Чтобы получить фактический элемент, мне нужно извлечь часть массива data вместо того, чтобы рассматривать возвращенный элемент как элемент, как это работает, когда не хранится очередь в APC, и как я предполагал, что это будет работатьи сейчас.

Это особенность сериализации объектов или я неправильно к ней подхожу?

Обновление: Проблема заключалась в том, что у меня былотдельная функция, которая делала дополнительные бесполезные действия, кроме extract().Эта функция возвращала элемент в виде массива, но как только я явно вызвал extract(), я получил элемент, как и ожидалось.Существуют ли определенные меры предосторожности для использования с открытыми функциями в сериализованных объектах?

1 Ответ

0 голосов
/ 22 июня 2011

Вы смешали / переключили это, вероятно:

В вашем коде вы сериализуете массив $data, а не "ваш объект".Я не совсем уверен в этом, потому что я не знаю, для чего предназначена функция insert().

Но для сериализации в объекте с serializable интерфейсом вы получитеназад то, что было возвращено с object::serialize().

Когда вы сериализируете массив, вы вернете сериализованный массив обратно.PHP в фоновом режиме заботится о том, чтобы он был сохранен как ваш объект.

...