我知道序列化已经习惯了 将数据类型转换为可存储的 格式,用于缓存等目的。
我更具体地问的是,在实际决定存储数据的情况下(在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语句的结果,它会序列化查询的结果,还是?
加成:
如果有人能够提供有效/实际使用/错误使用序列化的具体示例,那就太好了 - 就像一个多页面,巨大的形式,可以提取数据库信息并将内容存储在会话中,或者您必须依赖序列化的任何示例..
答案 0 :(得分:5)
配置。
如果两个答案都是肯定的,请考虑一下。
配置。
如果两个答案都是肯定的,请考虑一下。
配置。
如果两个答案都是肯定的,请考虑一下。
我从不会因为可以而序列化我的数据。我需要有理由这样做,否则它只是过早的优化。决定是否应该这样做有几个因素。
这几乎总是一个坏主意。例如如果你从数据库中序列化了一个结果集,然后需要通过某个字段重新排序这个集合,那么你就是在自己的脚下拍摄。
如果您需要将序列化数据传递给其他服务/语言,那么选择序列化至关重要。如果我知道或认为其他事情可能需要阅读它,我会避免使用特定于语言的方法进行序列化。 JSON通常是跨语言序列化的理想格式。
您必须愿意重新生成序列化数据以更新其源。对序列化数据进行任何类型的复杂更新都会非常昂贵。
如果您需要轻松阅读,我建议您避免使用特定于语言的格式。我建议使用JSON。
我再次查看示例3中的查询。这是一个非常简单的查询,您只选择2个字段,并按日期字段排序。使用正确索引的表,此查询应该是微不足道的,我不建议将这样的内容缓存到memcached中。
答案 1 :(得分:3)
在什么情况下你应该真正决定存储数据(在PHP中使用serialize(),在Python中使用pickle模块等等)?
这个问题很容易回答。各种情况实际上并没有多大关系。
以下是答案您必须序列化。不久。
许多API不接受Python对象。当API无法接受Python对象时,您通常可以提供字符串。这就是你序列化的时候。
实施例。您希望在持久存储上保存Python对象。遗憾的是,file
对象无法编写Python对象。所以你序列化。
实施例。您想将Python对象发送到另一个进程。你正在使用套接字,命名管道或其他什么。这些都是file
个对象,文件对象无法编写Python对象。所以你序列化。
这就是你序列化的时候。
XML文件是序列化的DOM树。 Python对象是一个DOM树。 XML文件是序列化DOM树的一种方法。我不明白这个例子。
表单标签字符串是字符串。它们不需要序列化。 I18N与您的应用程序分开处理。 http://docs.python.org/library/i18n.html我不明白这个例子。
这是一个查询。你没有序列化任何东西。你只是做查询。结果(原则上)总是在变化,因此任何序列化都是先前的结果,而不是当前的结果,所以你不会这样做。
奖金。多页,巨大的形式?你没有序列化任何东西。您只需在Web框架中更新会话即可。 Web框架的会话管理器可能会序列化Python对象,但这就是您使用框架的原因 - 所以您不必关心。
序列化用于将Python对象写入文件。这在Web应用程序中很少见。大多数情况下,您使用SQL写入数据库。