We have a proposed solution for 2.x -> 3.x. In 3.x, an (8-bit) str
instance received from 2.x will be decoded into a (Unicode) str
instance. The encoding defaults to ASCII; you can specify a different
encoding and also an error value on the load() or loads() call.
This of course doesn't solve all problems; str instances representing
binary data will be unpickled as strings. The app will have to deal
with this.
By default 3.x will *write* pickles using a new version number which is
incompatible with 2.x. I'm not sure yet if we should allow writing
pickles in 3.x that can be read in 2.x; we need use cases for that.