为什么要为数据库序列化对象



我知道序列化的含义,但不知道如何应用它。什么时候为数据库序列化对象。语言并不重要,但这里是PHP。

<?php
// $session_data contains a multi-dimensional array with session
// information for the current user.  We use serialize() to store
// it in a database at the end of the request.
$conn = odbc_connect("webdb", "php", "chicken");
$stmt = odbc_prepare($conn,
      "UPDATE sessions SET data = ? WHERE id = ?");
$sqldata = array (serialize($session_data), $_SERVER['PHP_AUTH_USER']);
if (!odbc_execute($stmt, $sqldata)) {
    $stmt = odbc_prepare($conn,
     "INSERT INTO sessions (id, data) VALUES(?, ?)");
    if (!odbc_execute($stmt, $sqldata)) {
        /* Something went wrong.. */
    }
}
?>

我为什么要这么做?为什么我不使用一个常规的查询执行来更新或插入呢。我读了代码注释,但我没有领会。

编辑:session_data中有什么信息是我不需要在常规列中拥有的?

Serialization通常用于通过数据流在应用程序(有时是机器、进程)之间发送对象,例如,通过HTTP协议的web服务通信、套接字通信等。在数据库的上下文中,只有当对象或其某些部分无法作为其属性的值完全存储在列中时,才需要序列化。若您被迫存储一些新数据,但无法更新数据库的现有模式,就会出现这种情况。然后,您可能会使用一些varchar列以XML格式存储更多的数据。当然,这是不鼓励的,但是有时当您使用遗留代码时,没有其他方法。

数据库(以及其他外部存储/传输系统)在字节块上工作。因此,有人需要将内存中的内容转换为一个字节块,该字节块也可以转换回内存中最初的内容。对于某些事情来说,这是微不足道的,系统(PHP,db,..)知道如何做到这一点(例如字符串)。但内存中可能有一个非常复杂的东西——例如数组字典。必须有人将其制作成一个连续的可恢复字节块(序列化),并提供一种将块转换回内存中原始数据的方法(反序列化)

最新更新