我有一个将对象存储到会话中的Service类
$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: “仅Http”; b:0;}} I:1; S:2: “EN”;}“
将对象的所有属性设置为受保护不起作用。 我做错了什么?
答案 0 :(得分:5)
session-> serialize()和unserialize()不执行您认为的操作,它们不会序列化和反序列化对象,它们会序列化和反序列化整个会话。它们没有采用任何参数,实际上已经在Symfony 2.1中删除了
您可以将对象设置为会话,Symfony将负责为您序列化和反序列化,只需使用:
$this->session->set('utmUser', $this->utmUser);
和
$this->utmUser = $this->session->get('utmUser');
在任何情况下,如果您确实需要将整个对象存储到会话中,您可能会重新考虑。如果这是一个大对象,这可能是非常低效的。如果是这种情况并且对象存储在数据库中,则可以只存储对象的id,然后在需要时从id重新加载它。
答案 1 :(得分:1)
实际上,并不是说Symfony会为你处理对象的序列化和反序列化。
对于标准Symfony对象(比如Request对象,可以说),但是如果要存储自定义对象而不实现 serialize()和 unserialize()< / em>方法, 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;
}
}