diff --git a/addressfield.install b/addressfield.install
index ada5912..62467ff 100644
--- a/addressfield.install
+++ b/addressfield.install
@@ -96,8 +96,8 @@ function addressfield_field_schema() {
       'not null' => FALSE,
       'default' => '',
     ),
-    'data' => array(
-      'description' => 'Additional data for this address.',
+    'data_serialized' => array(
+      'description' => 'Additional data for this address (serialized).',
       'type' => 'text',
       'size' => 'big',
       'not null' => FALSE,
@@ -184,3 +184,77 @@ function addressfield_update_7000() {
     }
   }
 }
+
+/**
+ * Rename the data column.
+ */
+function addressfield_update_7001() {
+  $spec = array(
+    'description' => 'Additional data for this address (serialized).',
+    'type' => 'text',
+    'size' => 'big',
+    'not null' => FALSE,
+    'serialize' => TRUE,
+    'initial' => serialize(array())
+  );
+  $fields = _update_7000_field_read_fields(array(
+    'module' => 'addressfield',
+    'storage_type' => 'field_sql_storage',
+  ));
+  foreach ($fields as $field_name => $field) {
+    if ($field['deleted']) {
+      $table = "field_deleted_data_{$field['id']}";
+      $revision_table = "field_deleted_revision_{$field['id']}";
+    }
+    else {
+      $table = "field_data_{$field['field_name']}";
+      $revision_table = "field_revision_{$field['field_name']}";
+    }
+    $column = $field['field_name'] . '_data';
+    $new_column = $field['field_name'] . '_data_serialized';
+    if (db_field_exists($table, $column)) {
+      db_change_field($table, $column, $new_column, $spec);
+      db_change_field($revision_table, $column, $new_column, $spec);
+    }
+  }
+}
+
+
+/**
+ * Serialize existing values in the data_serialized column.
+ */
+function addressfield_update_7002() {
+  $fields = _update_7000_field_read_fields(array(
+    'module' => 'addressfield',
+    'storage_type' => 'field_sql_storage',
+  ));
+  $serialized_false = serialize(false);
+
+  foreach ($fields as $field) {
+
+    $column = $field['field_name'] . '_data_serialized';
+    $columns = array('entity_type', 'entity_id', 'revision_id', 'delta', 'language', $column);
+
+    foreach (array('data', 'revision') as $table_type) {
+      $table = $field['deleted']
+        ? 'field_deleted_' . $table_type . '_' . $field['id']
+        : 'field_' . $table_type . '_' . $field['field_name'];
+      $result = db_select($table, 't')->fields('t', $columns)->execute();
+
+      foreach ($result as $row) {
+        $data = $row->$column;
+        $unserialized_data = @unserialize($data);
+        if ($unserialized_data === FALSE && $data !== $serialized_false) {
+          db_update($table)
+            ->fields(array($column => serialize($data)))
+            ->condition('entity_type', $row->entity_type)
+            ->condition('entity_id', $row->entity_id)
+            ->condition('revision_id', $row->revision_id)
+            ->condition('delta', $row->delta)
+            ->condition('language', $row->language)
+            ->execute();
+        }
+      }
+    }
+  }
+}
diff --git a/addressfield.module b/addressfield.module
index c010514..440556c 100644
--- a/addressfield.module
+++ b/addressfield.module
@@ -353,6 +353,20 @@ function addressfield_field_info() {
 }
 
 /**
+ * Implements hook_field_load()
+ */
+function addressfield_field_load($entity_type, $entities, $field, $instances, $langcode, &$items, $age) {
+  foreach ($entities as $id => $entity) {
+    foreach ($items[$id] as $delta => &$item) {
+      if (!empty($item['data_serialized'])) {
+        $item['data'] = unserialize($item['data_serialized']);
+      }
+      unset($item['data_serialized']);
+    }
+  }
+}
+
+/**
  * Returns an array of default values for the addressfield form elements.
  */
 function addressfield_default_values($available_countries = NULL) {
@@ -383,7 +397,7 @@ function addressfield_default_values($available_countries = NULL) {
     'thoroughfare' => '',
     'premise' => '',
     'sub_premise' => '',
-    'data' => '',
+    'data' => array(),
   );
 }
 
@@ -422,6 +436,8 @@ function addressfield_field_presave($entity_type, $entity, $field, $instance, $l
         $value = trim(str_replace('  ', ' ', $value));
       }
     }
+
+    $item['data_serialized'] = serialize($item['data']);
   }
 }
 
