0

我有一个将对象存储到会话中的服务类

$this->session->set('utmUser', $this->session->serialize($this->utmUser));

我从会话中得到未序列化的对象:

$this->utmUser = $this->session->unserialize($this->session->get('utmUser'));

但结果不是存储对象的实例。

会话包含此序列化字符串:

string(221) "a:2:{i:0;O:68:"Symfony\Component\HttpFoundation\SessionStorage\NativeSessionStorage":1:{s:10:"*options";a:5:{s:8 :"生命周期";i:0;s:4:"路径";s:1:"/";s:6:"域";s:0:"";s:6:"安全";b: 0;s:8:"httponly";b:0;}}i:1;s:2:"en";}"

将对象的所有属性设置为受保护不起作用。我究竟做错了什么?

4

2 回答 2

5

session->serialize() 和 unserialize() 不会像您认为的那样做,它们不会序列化和反序列化对象,它们会序列化和反序列化整个会话。它们不带任何参数,实际上已在 Symfony 2.1 中删除

您只需将对象设置到会话中,Symfony 就会为您处理序列化和反序列化,只需使用:

$this->session->set('utmUser', $this->utmUser);

$this->utmUser = $this->session->get('utmUser');

在任何情况下,您都可以重新考虑是否真的需要将整个对象存储到会话中。如果这是一个大对象,则效率可能非常低。如果是这种情况并且对象存储在数据库中,您可以只存储对象的 id,然后在需要时从 id 重新加载它。

于 2012-08-08T08:28:58.673 回答
1

实际上,Symfony 不会为您处理对象的序列化和反序列化。

对于标准的 Symfony 对象(比如 Request 对象,比如说)可能是这样,但是如果你想存储你的自定义对象而不实现serialize()unserialize()方法,Symfony/PHP 将会崩溃

此外,它不会在保存对象时崩溃,而是在从数据库加载会话时(特别是在每次 session_start() 调用时)。所以它可能会引起很多麻烦 - 你不会看到任何错误,只是无限加载页面!

解决方案:只需实现 \Serializable 接口。例子:

namespace AppBundle\Event;

use Symfony\Component\EventDispatcher\GenericEvent;

class MyEvent extends GenericEvent implements \Serializable
{

  /* ... */

  public function serialize()
  {
    return serialize(
      [
        $this->property1,
        $this->property2,
      ]
    );
  }

  public function unserialize($serialized)
  {
    $data = unserialize($serialized);
    list(
      $this->property1, 
      $this->property2,
      ) = $data;
  }
}
于 2016-11-13T13:29:19.773 回答