<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Symfony中文教程 &#187; serialize</title>
	<atom:link href="http://www.newlifeclan.com/symfony/archives/tag/serialize/feed" rel="self" type="application/rss+xml" />
	<link>http://www.newlifeclan.com/symfony</link>
	<description>站在巨人肩膀上的phpweb框架</description>
	<lastBuildDate>Fri, 12 Dec 2025 00:58:27 +0000</lastBuildDate>
	<language>zh-CN</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.0.38</generator>
	<item>
		<title>KU案例2之14 用户序列化</title>
		<link>http://www.newlifeclan.com/symfony/archives/442</link>
		<comments>http://www.newlifeclan.com/symfony/archives/442#comments</comments>
		<pubDate>Sat, 11 Apr 2015 07:35:56 +0000</pubDate>
		<dc:creator><![CDATA[napoleon]]></dc:creator>
				<category><![CDATA[实战教程]]></category>
		<category><![CDATA[serialize]]></category>
		<category><![CDATA[序列化]]></category>

		<guid isPermaLink="false">http://www.newlifeclan.com/symfony/?p=442</guid>
		<description><![CDATA[<p>这里有一个问题，我不得不打扰一下，我希望我们先考虑一点点序列化问题。当我们用户登录后，会得到一个User实体， [&#8230;]</p>
<p><a rel="nofollow" href="http://www.newlifeclan.com/symfony/archives/442">KU案例2之14 用户序列化</a>，首发于<a rel="nofollow" href="http://www.newlifeclan.com/symfony">Symfony中文教程</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>这里有一个问题，我不得不打扰一下，我希望我们先考虑一点点序列化问题。当我们用户登录后，会得到一个User实体，这个User实体会存储在session中。为此，为了节省资源，应该让php序列化User对象并储存在session中，当用户请求页面，再将该序列化字符串反解成User对象。</p>
<p><span id="more-442"></span></p>
<blockquote><p>如果你感觉真的很好奇，序列化和反序列化用户信息的类被称为<tt class="docutils literal"><span class="pre">ContextListener</span></tt>。</p></blockquote>
<p>这是伟大的！但是，doctrine会出现一些疑难杂症。有时，doctrine会把一些额外没有用的信息放到我们的实体中，例如entity manager：这个东西保存了一些很大又重要的信息。</p>
<p>虽然很重要，但是通常，我们用不到这些。如果我们把所有的内容都序列化到session中很可能导致失败。而且这个entity manager包含数据库连接和其他信息，他们很私密所以不能被序列化。</p>
<p>使用Serializable接口</p>
<p>我们需要帮助doctrine，开始添加Serializable接口到User类。这个接口需要实现两个方法：<tt class="docutils literal"><span class="pre">serialize和</span></tt> <tt class="docutils literal"><span class="pre">unserialize</span></tt>:</p><pre class="crayon-plain-tag">// src/Yoda/UserBundle/Entity/User.php
// ...

use Serializable;

class User implements AdvancedUserInterface, Serializable
{
    // ...

    public function serialize()
    {
        // todo - do some mad serialization
    }

    public function unserialize($serialized)
    {
        // todo - and some equally angry de-serialization
    }
}</pre><p>当user对象去序列化，他就会调用serialize方法，去替代自动方法。当字符串反序列化，unserialize方法就会被调用。看上去很奇怪，但是只有这样才能帮助我们返回一个序列化的数组，里面包含id、username、password，对于unserialize，也仅仅是这三个值：</p><pre class="crayon-plain-tag">// src/Yoda/UserBundle/Entity/User.php
// ..

public function serialize()
{
    return serialize(array(
        $this-&gt;id,
        $this-&gt;username,
        $this-&gt;password,
    ));
}

public function unserialize($serialized)
{
    list (
        $this-&gt;id,
        $this-&gt;username,
        $this-&gt;password,
    ) = unserialize($serialized);
}</pre><p>你仔细想想，我们好像破坏了一些事情。当symfony从session中获取一些数据并反序列化它，我们最终得到的是一个丢失的数据，例如：roles和isActive。这就不酷了！很糟糕</p>
<p>多虑了：symfony安全系统非常的聪明，在每次请求时会利用id查询出一个新的完整的User对象副本。</p>
<p>我们可以在debug工具条中看到：一旦用户登录，这个请求就会从数据库中抓取当前用户。所以说，没有问题！</p>
<p><a rel="nofollow" href="http://www.newlifeclan.com/symfony/archives/442">KU案例2之14 用户序列化</a>，首发于<a rel="nofollow" href="http://www.newlifeclan.com/symfony">Symfony中文教程</a>。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.newlifeclan.com/symfony/archives/442/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
