Index: pyamf/adapters/_google_appengine_ext_db.py
===================================================================
--- pyamf/adapters/_google_appengine_ext_db.py	(revision 1570)
+++ pyamf/adapters/_google_appengine_ext_db.py	(working copy)
@@ -26,11 +26,8 @@
         remove = True
         self.context.class_aliases[obj.__class__] = pyamf.ClassAlias(obj.__class__, None)
 
-    self.writeObject(obj, *args, **kwargs)
+    writeObjectAMF(self, obj, args, kwargs, remove)
 
-    if remove:
-        self.context.class_aliases[obj.__class__] = None
-
 def writeObjectAMF3(self, obj, *args, **kwargs):
     try:
         self.context.getClassDefinitionReference(obj)
@@ -44,8 +41,18 @@
             alias = pyamf.ClassAlias(obj.__class__, None)
             self.context.class_aliases[obj.__class__] = alias
 
+    writeObjectAMF(self, obj, args, kwargs, remove)
+
+def writeObjectAMF(self, obj, args, kwargs, remove):
+    """
+    Writes an object that has already been prepared by writeObjectAMF0 or writeObjectAMF3.
+    """
+    try:
+        obj._key = str(obj.key())
+    except:
+        obj._key = None
     self.writeObject(obj, *args, **kwargs)
-
+    del obj._key
     if remove:
         self.context.class_aliases[obj.__class__] = None
 
@@ -53,13 +60,13 @@
     """
     Returns a list of properties on an C{db.Model} instance.
     """
-    return list(obj.__class__._properties)
+    return list(obj.__class__._properties) + ['_key']
 
 def get_attrs_for_expando(obj):
     """
     Returns a list of dynamic properties on a C{db.Expando} instance.
     """
-    return obj.dynamic_properties()
+    return obj.dynamic_properties() + ['_key']
 
 pyamf.register_class(db.Model, attr_func=get_attrs_for_model, metadata=['dynamic'])
 pyamf.register_class(db.Expando, attr_func=get_attrs_for_expando, metadata=['dynamic'])
