Index: django/core/serializers/xml_serializer.py
===================================================================
--- django/core/serializers/xml_serializer.py	(revision 13754)
+++ django/core/serializers/xml_serializer.py	(working copy)
@@ -42,11 +42,17 @@
             raise base.SerializationError("Non-model object (%s) encountered during serialization" % type(obj))
 
         self.indent(1)
-        self.xml.startElement("object", {
-            "pk"    : smart_unicode(obj._get_pk_val()),
-            "model" : smart_unicode(obj._meta),
-        })
+        obj_pk = obj._get_pk_val()
+        if obj_pk is None:
+            attrs = {"model": smart_unicode(obj._meta),}
+        else:
+            attrs = {
+                "pk": smart_unicode(obj._get_pk_val()),
+                "model": smart_unicode(obj._meta),
+            }
 
+        self.xml.startElement("object", attrs)
+
     def end_object(self, obj):
         """
         Called after handling all fields for an object.
@@ -166,11 +172,12 @@
         # bail.
         Model = self._get_model_from_node(node, "model")
 
-        # Start building a data dictionary from the object.  If the node is
-        # missing the pk attribute, bail.
-        pk = node.getAttribute("pk")
-        if not pk:
-            raise base.DeserializationError("<object> node is missing the 'pk' attribute")
+        # Start building a data dictionary from the object.
+        # If the node is missing the pk set it to None
+        if node.hasAttribute("pk"):
+            pk = node.getAttribute("pk")
+        else:
+            pk = None
 
         data = {Model._meta.pk.attname : Model._meta.pk.to_python(pk)}
 
 Index: tests/modeltests/serializers/tests.py
===================================================================
--- tests/modeltests/serializers/tests.py	(working copy)
+++ tests/modeltests/serializers/tests.py	(working copy)
@@ -219,6 +219,18 @@
         self.assertTrue(date_values)
         assert date_values[0].startswith("0001")
 
+    def test_pkless_serialized_strings(self):
+        """
+        Tests that serialized strings without PKs
+        can be turned into models
+        """
+        deserial_objs = list(serializers.deserialize(self.serializer_name,
+                                                self.pkless_str))
+        for obj in deserial_objs:
+            self.assertFalse(obj.object.id)
+            obj.save()
+        self.assertEqual(Category.objects.all().count(), 4)
+
 
 class XmlSerializerTestCase(SerializersTestBase, TestCase):
     serializer_name = "xml"
@@ -241,6 +253,12 @@
                             '<field type="CharField" name="name">'
                             'Reference</field></object>'
                             '</django-objects>')
+    pkless_str = ('<?xml version="1.0" encoding="utf-8"?>'
+                           '<django-objects version="1.0">'
+                           '<object model="serializers.category">'
+                            '<field type="CharField" name="name">'
+                            'Reference</field></object>'
+                            '</django-objects>')
 
     @staticmethod
     def _validate_output(serial_str):
@@ -275,6 +293,8 @@
                     '"fields": {"name": "Reference"}},'
                     '{"pk": 1, "model": "serializers.author",'
                     '"fields": {"name": "Agnes"}}]')
+    pkless_str = ('[{"pk": null, "model": "serializers.category",'
+                    '"fields": {"name": "Reference"}}]')
 
     @staticmethod
     def _validate_output(serial_str):
@@ -316,6 +336,10 @@
                         '    name: Agnes',
                         '  pk: 1',
                         '  model: serializers.author',])
+        pkless_str = "\n".join(['- fields:',
+                        '    name: Reference',
+                        '  pk: null',
+                        '  model: serializers.category'])
 
         @staticmethod
         def _validate_output(serial_str):
