【问题标题】:Store serialized object in session在会话中存储序列化对象
【发布时间】:2012-08-08 04:02:27
【问题描述】:

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

$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";}"

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

【问题讨论】:

    标签: symfony


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      实际上,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;
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-25
        • 2013-01-10
        • 2012-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-18
        相关资源
        最近更新 更多