在什么情况下你应该序列化数据?什么时候不应该?

时间:2010-01-09 06:58:47

标签: php python serialization

  

我知道序列化已经习惯了   将数据类型转换为可存储的   格式,用于缓存等目的。

我更具体地问的是,在实际决定存储数据的情况下(在PHP中使用serialize(),在Python中使用pickle模块等)?

假设我们有一个流量很大的网站,在我们的/blog页面中,我们使用静态内容xml文件,gettext mo文件以及动态生成的数据库内容。

示例#1:

我们依赖静态内容的文件是en/blog.xml

'<content><![CDATA[
<h1>Welcome to my blog!</h1>
<p>Lorem ipsum dolor sit amet..</p>

]]></content>'

我们想要自己序列化这个xml文件并将其存储在缓存中吗?

示例#2:

我们还有一个动态生成的表单,通常我会假设我不会序列化任何东西,因为它是服务器端生成的和动态的,但我们的表单字段标签是国际化的,用户请求这个页面用西班牙语,因此我们使用的是翻译类,用于抓取以mo/csv/xml格式存储的表单字段标签。

contact-us.php的内容:

<label for="first_name"><?php echo $L->_("First Name");?></label>
<input id="first_name" name="first_name" type="text">

从应用程序级别的翻译文件中提取“名字”消息ID翻译,我们将其翻译并存储在驻留在翻译课程中的数组中。因此,我们的代码不能解析每个页面请求上的mo文件,而是在解析mo之后序列化整个数组,然后依赖序列化的转储,这是理想的吗?

示例#3:

让我们在我们的博客页面上说我们正在阅读最近的5篇博文。

$posts = BlogClass->sql('SELECT blog_message, blog_author FROM blog_posts LIMIT 5 ORDER BY blog_date DESC');

我们是否希望依赖于memcache之类的东西,只需设置一个键到sql语句的结果,它会序列化查询的结果,还是?

加成:

如果有人能够提供有效/实际使用/错误使用序列化的具体示例,那就太好了 - 就像一个多页面,巨大的形式,可以提取数据库信息并将内容存储在会话中,或者您必须依赖序列化的任何示例..

2 个答案:

答案 0 :(得分:5)

示例1

配置。

  • 生成内容页面的代价是否过高?
  • 反序列化生成的内容的成本是否低得多?

如果两个答案都是肯定的,请考虑一下。

示例2

配置。

  • 生成内容页面的代价是否过高?
  • 反序列化生成的内容的成本是否低得多?

如果两个答案都是肯定的,请考虑一下。

示例3

配置。

  • 这个查询是否过于昂贵?
  • 从memcached中获取数据是否明显更快?

如果两个答案都是肯定的,请考虑一下。

加成

我从不会因为可以而序列化我的数据。我需要有理由这样做,否则它只是过早的优化。决定是否应该这样做有几个因素。

对序列化数据集执行排序或其他操作

这几乎总是一个坏主意。例如如果你从数据库中序列化了一个结果集,然后需要通过某个字段重新排序这个集合,那么你就是在自己的脚下拍摄。

信息

如果您需要将序列化数据传递给其他服务/语言,那么选择序列化至关重要。如果我知道或认为其他事情可能需要阅读它,我会避免使用特定于语言的方法进行序列化。 JSON通常是跨语言序列化的理想格式。

更新序列化数据

您必须愿意重新生成序列化数据以更新其源。对序列化数据进行任何类型的复杂更新都会非常昂贵。

人类可读性

如果您需要轻松阅读,我建议您避免使用特定于语言的格式。我建议使用JSON。

编辑:

我再次查看示例3中的查询。这是一个非常简单的查询,您只选择2个字段,并按日期字段排序。使用正确索引的表,此查询应该是微不足道的,我不建议将这样的内容缓存到memcached中。

答案 1 :(得分:3)

在什么情况下你应该真正决定存储数据(在PHP中使用serialize(),在Python中使用pickle模块等等)?

这个问题很容易回答。各种情况实际上并没有多大关系。

以下是答案您必须序列化。不久。

许多API不接受Python对象。当API无法接受Python对象时,您通常可以提供字符串。这就是你序列化的时候。

实施例。您希望在持久存储上保存Python对象。遗憾的是,file对象无法编写Python对象。所以你序列化。

实施例。您想将Python对象发送到另一个进程。你正在使用套接字,命名管道或其他什么。这些都是file个对象,文件对象无法编写Python对象。所以你序列化。

这就是你序列化的时候。

  1. XML文件序列化的DOM树。 Python对象是一个DOM树。 XML文件是序列化DOM树的一种方法。我不明白这个例子。

  2. 表单标签字符串是字符串。它们不需要序列化。 I18N与您的应用程序分开处理。 http://docs.python.org/library/i18n.html我不明白这个例子。

  3. 这是一个查询。你没有序列化任何东西。你只是做查询。结果(原则上)总是在变化,因此任何序列化都是先前的结果,而不是当前的结果,所以你不会这样做。

  4. 奖金。多页,巨大的形式?你没有序列化任何东西。您只需在Web框架中更新会话即可。 Web框架的会话管理器可能会序列化Python对象,但这就是您使用框架的原因 - 所以您不必关心。

    序列化用于将Python对象写入文件。这在Web应用程序中很少见。大多数情况下,您使用SQL写入数据库。