Real pickling for bytes.
Restore complex pickling.
Use cPickle in io.py.
diff --git a/Lib/copy_reg.py b/Lib/copy_reg.py
index 8760e62..f4661ed 100644
--- a/Lib/copy_reg.py
+++ b/Lib/copy_reg.py
@@ -23,12 +23,18 @@
     if not callable(object):
         raise TypeError("constructors must be callable")
 
-# Example: provide pickling support for bytes objects.
+# Example: provide pickling support for complex numbers.
 
-def _pickle_bytes(b):
-    return bytes, (str(b),)
+try:
+    complex
+except NameError:
+    pass
+else:
 
-pickle(bytes, _pickle_bytes)
+    def pickle_complex(c):
+        return complex, (c.real, c.imag)
+
+    pickle(complex, pickle_complex, complex)
 
 # Support for pickling new-style objects
 
diff --git a/Lib/io.py b/Lib/io.py
index b2860f4..fd39826 100644
--- a/Lib/io.py
+++ b/Lib/io.py
@@ -30,10 +30,14 @@
 import os
 import sys
 import codecs
-import pickle
 import _fileio
 import warnings
 
+try:
+    import cPickle as pickle
+except ImportError:
+    import pickle
+
 # XXX Shouldn't we use st_blksize whenever we can?
 DEFAULT_BUFFER_SIZE = 8 * 1024  # bytes
 
diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c
index d985fc7..be3da7a 100644
--- a/Objects/bytesobject.c
+++ b/Objects/bytesobject.c
@@ -2598,6 +2598,17 @@
     return NULL;
 }
 
+PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
+
+static PyObject *
+bytes_reduce(PyBytesObject *self)
+{
+    return Py_BuildValue("(O(s#))",
+                         self->ob_type,
+                         self->ob_bytes == NULL ? "" : self->ob_bytes,
+                         self->ob_size);
+}
+
 static PySequenceMethods bytes_as_sequence = {
     (lenfunc)bytes_length,              /* sq_length */
     (binaryfunc)bytes_concat,           /* sq_concat */
@@ -2650,8 +2661,10 @@
     {"remove", (PyCFunction)bytes_remove, METH_O, remove__doc__},
     {"decode", (PyCFunction)bytes_decode, METH_VARARGS, decode_doc},
     {"__alloc__", (PyCFunction)bytes_alloc, METH_NOARGS, alloc_doc},
-    {"fromhex", (PyCFunction)bytes_fromhex, METH_VARARGS|METH_CLASS, fromhex_doc},
+    {"fromhex", (PyCFunction)bytes_fromhex, METH_VARARGS|METH_CLASS,
+     fromhex_doc},
     {"join", (PyCFunction)bytes_join, METH_O|METH_CLASS, join_doc},
+    {"__reduce__", (PyCFunction)bytes_reduce, METH_NOARGS, reduce_doc},
     {NULL}
 };