Python保存正确处理str / unicode的序列化?

时间:2011-08-09 05:27:44

标签: python serialization

除了PyYAML之外,是否有正确处理unicode / str的安全Python数据序列化库?

例如:

>>> json.loads(json.dumps([u"x", "x"]))
[u'x', u'x'] # Both unicode
>>> msgpack.loads(msgpack.dumps([u"x", "x"]))
['x', 'x'] # Neither are unicode
>>> bson.loads(bson.dumps({"x": [u"x", "x"]}))
{u'x': [u'x', 'x']} # Dict keys become unicode
>>> pyamf.decode(pyamf.encode([u"x", "x"])).next()
[u'x', u'x'] # Both are unicode

请注意,我希望序列化程序安全(因此picklemarshel已经完成),并且PyYAML是一个选项,但我不喜欢YAML的复杂性,所以我想知道是否还有其他选择。

修改:似乎对我数据的性质存在一些疑惑。其中一些是Unicode(例如,名称),其中一些是二进制(例如,图像)...因此,混淆unicodestr的序列化库对我来说就像一个混淆的库一样无用"42"42

3 个答案:

答案 0 :(得分:3)

也许只需使用Python的repr来存储值,然后使用ast .literal_eval方法对其进行反序列化:

In [7]: ast.literal_eval (repr({"d": ["x", u"x"]}))
Out[7]: {'d': ['x', u'x']}

答案 1 :(得分:1)

您是否尝试过bert

>>> import bert
>>> bert.decode(bert.encode([u"x", "x"]))
[u'x', 'x']
>>> bert.decode(bert.encode({"x":[u"x", "x"]}))
{'x': [u'x', 'x']}

(要安装,你必须先手动安装erlastic,因为this outstanding pull request

答案 2 :(得分:1)

寻找同样的事情我发现msgpack-python 0.4现在支持带有use_bin_type / encoding参数的str / unicode:

>>> msgpack.unpackb(msgpack.packb(["uu\x00u", u"adsa\xe4"], use_bin_type=True, encoding="utf-8"), encoding="utf-8")
['uu\x00u', u'adsa\xe4']