np.bool is the only dtype I've found that causes this issue. Both empty and non-empty arrays cause it.
The issue only manifests from py2 to py3; staying within the same version succeeds, as does serializing from py3 and deserializing in py2.
This appears to just be due to Python 2 str being deserialized in Python 3 as bytes; it should be unicode on the py2 end to come back as str in py3. I suppose something in the serialization implementation is writing the dtype (just for bool arrays?) using a str, but haven't dug into it yet.