Index: includes/bootstrap.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/bootstrap.inc,v
retrieving revision 1.145.2.8
diff -u -r1.145.2.8 bootstrap.inc
--- includes/bootstrap.inc	10 Jan 2008 22:14:24 -0000	1.145.2.8
+++ includes/bootstrap.inc	11 Jul 2008 16:55:16 -0000
@@ -382,14 +382,14 @@
 function variable_init($conf = array()) {
   // NOTE: caching the variables improves performance by 20% when serving cached pages.
   if ($cached = cache_get('variables', 'cache')) {
-    $variables = unserialize($cached->data);
+    $variables = $cached->data;
   }
   else {
     $result = db_query('SELECT * FROM {variable}');
     while ($variable = db_fetch_object($result)) {
       $variables[$variable->name] = unserialize($variable->value);
     }
-    cache_set('variables', 'cache', serialize($variables));
+    cache_set('variables', 'cache', $variables);
   }
 
   foreach ($conf as $name => $value) {
Index: includes/cache.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/cache.inc,v
retrieving revision 1.5.2.5
diff -u -r1.5.2.5 cache.inc
--- includes/cache.inc	10 Feb 2008 02:05:00 -0000	1.5.2.5
+++ includes/cache.inc	11 Jul 2008 16:55:16 -0000
@@ -22,12 +22,15 @@
     db_query("DELETE FROM {". $table ."} WHERE expire != %d AND expire <= %d", CACHE_PERMANENT, $cache_flush);
   }
 
-  $cache = db_fetch_object(db_query("SELECT data, created, headers, expire FROM {". $table ."} WHERE cid = '%s'", $key));
+  $cache = db_fetch_object(db_query("SELECT data, created, headers, expire, serialized FROM {". $table ."} WHERE cid = '%s'", $key));
   if (isset($cache->data)) {
     // If the data is permanent or we're not enforcing a minimum cache lifetime
     // always return the cached data.
     if ($cache->expire == CACHE_PERMANENT || !variable_get('cache_lifetime', 0)) {
       $cache->data = db_decode_blob($cache->data);
+      if ($cache->serialized) {
+        $cache->data = unserialize($cache->data);
+      }
     }
     // If enforcing a minimum cache lifetime, validate that the data is
     // currently valid for this user before we return it by making sure the
@@ -41,6 +44,9 @@
       }
       else {
         $cache->data = db_decode_blob($cache->data);
+        if ($cache->serialized) {
+          $cache->data = unserialize($cache->data);
+        }
       }
     }
     return $cache;
@@ -79,8 +85,8 @@
  *   The table $table to store the data in. Valid core values are 'cache_filter',
  *   'cache_menu', 'cache_page', or 'cache'.
  * @param $data
- *   The data to store in the cache. Complex data types must be serialized first.
- * @param $expire
+ *   The data to store in the cache. Complex data types will be automatically serialized before insertion.
+ *   Strings will be stored as plain text and not serialized. * @param $expire
  *   One of the following values:
  *   - CACHE_PERMANENT: Indicates that the item should never be removed unless
  *     explicitly told to using cache_clear_all() with a cache ID.
@@ -92,10 +98,15 @@
  *   A string containing HTTP header information for cached pages.
  */
 function cache_set($cid, $table = 'cache', $data, $expire = CACHE_PERMANENT, $headers = NULL) {
+  $serialized = 0;
+  if (is_object($data) || is_array($data)) {
+    $data = serialize($data);
+    $serialized = 1;
+  }
   db_lock_table($table);
-  db_query("UPDATE {". $table. "} SET data = %b, created = %d, expire = %d, headers = '%s' WHERE cid = '%s'", $data, time(), $expire, $headers, $cid);
+  db_query("UPDATE {". $table. "} SET data = %b, created = %d, expire = %d, headers = '%s', serialized = %d WHERE cid = '%s'", $data, time(), $expire, $headers, $serialized, $cid);
   if (!db_affected_rows()) {
-    @db_query("INSERT INTO {". $table. "} (cid, data, created, expire, headers) VALUES ('%s', %b, %d, %d, '%s')", $cid, $data, time(), $expire, $headers);
+    @db_query("INSERT INTO {". $table. "} (cid, data, created, expire, headers, serialized) VALUES ('%s', %b, %d, %d, '%s', %d)", $cid, $data, time(), $expire, $headers, $serialized);
   }
   db_unlock_tables();
 }
@@ -165,4 +176,3 @@
     }
   }
 }
-
Index: includes/menu.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/menu.inc,v
retrieving revision 1.146.2.2
diff -u -r1.146.2.2 menu.inc
--- includes/menu.inc	11 Feb 2008 05:26:53 -0000	1.146.2.2
+++ includes/menu.inc	11 Jul 2008 16:55:17 -0000
@@ -208,12 +208,12 @@
 
     $cid = "$user->uid:$locale";
     if ($cached = cache_get($cid, 'cache_menu')) {
-      $_menu = unserialize($cached->data);
+      $_menu = $cached->data;
     }
     else {
       _menu_build();
       // Cache the menu structure for this user, to expire after one day.
-      cache_set($cid, 'cache_menu', serialize($_menu), time() + (60 * 60 * 24));
+      cache_set($cid, 'cache_menu', $_menu, time() + (60 * 60 * 24));
     }
 
     // Make sure items that cannot be cached are added.
Index: modules/locale/locale.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/locale/locale.module,v
retrieving revision 1.155.2.1
diff -u -r1.155.2.1 locale.module
--- modules/locale/locale.module	9 Jul 2008 21:48:42 -0000	1.155.2.1
+++ modules/locale/locale.module	11 Jul 2008 16:55:17 -0000
@@ -172,7 +172,7 @@
       locale_refresh_cache();
       $cache = cache_get("locale:$locale", 'cache');
     }
-    $locale_t = unserialize($cache->data);
+    $locale_t = $cache->data;
   }
 
   // We have the translation cached (if it is TRUE, then there is no
@@ -231,7 +231,7 @@
     while ($data = db_fetch_object($result)) {
       $t[$data->source] = (empty($data->translation) ? TRUE : $data->translation);
     }
-    cache_set("locale:$locale", 'cache', serialize($t));
+    cache_set("locale:$locale", 'cache', $t);
   }
 }
 
