Looking at the offending code (in matrix_integer_dense.pyx, line 535:

    def _unpickle(self, data, int version):
        if version == 0:
            if isinstance(data, bytes):
                self._unpickle_version0(data)
            elif isinstance(data, list):
                self._unpickle_matrix_2x2_version0(data)
            else:
                raise RuntimeError("invalid pickle data")
        else:
            raise RuntimeError("unknown matrix version (=%s)"%version)

it's the classing Py2/Py3 unpickle incompatibility: there's a shift between 
str/bytes/unicode between the 3 that rather fundamentally breaks pickling 
of them. It can be fixed fairly easily. We're probably unpickling what used 
to be a python 2 (str==bytes) object as a python 3 latin1-encoded string, 
because most py2 str/bytes objects are supposed to be strings (and latin1 
has the nice property that it preserves bit patterns).  So in the code 
above, we just need to check 

I think we want change this to something like:

         if version == 0:
+            if isinstance(data, str): #old Py2 pickle: old "bytes" object 
reaches us as a latin1-encoded string
+                data = data.encode('latin1')
             if isinstance(data, bytes):


Making this change is really worthwhile: these are small problems that are 
hard to find without a "pickle jar" without good coverage. Each of them is 
probably fairly easy to fix. These problems come up particularly when data 
is encoded as "bytes". That happens for optimized picklers. There aren't 
that many of them, so the number of these changes required is probably 
limited, and each of them can have a huge positive knock-on effect as you 
can see here.

(If I have important, expensive computational data I want to save for 
posterity, I would not go for Pickle anyway: you want something that's 
platform-independent. Sage will die at some point in the future too, and 
Pickle is not a format that is *that* easy to maintain: It's not archive 
quality in the librarian sense).

-- 
You received this message because you are subscribed to the Google Groups 
"sage-devel" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sage-devel/50cac9c1-760d-4f4f-b061-2183cf869a4bo%40googlegroups.com.

Reply via email to