2011-08-09 36 views
4

除了PyYAML,有沒有正確處理unicode/str的任何安全的Python數據序列化庫?Python保存正確處理str/unicode的序列化?

例如:

>>> 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的庫一樣無用。

+0

您確定您需要保留info是數據中的「unicode」還是「bytes」?不能在執行'load'的方法中處理? – agf

+1

是的,我很確定...有兩個原因。首先,如果'unicode'被用作一個函數的關鍵字參數(ex,'foo(** {u「bar」:42})'),那麼Python 2.6會爆炸,然後我會處理一些'unicode'數據和一些'bytes'數據,如果我的序列化庫會爲我保留這些數據,它將非常好。 –

回答

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

+0

有趣......這看起來不錯。雖然,我將不得不嘗試一下,看看序列化對象的大小是否可以接受......有些看起來很荒謬(例如,'len(bert.encode(u「」))== 40')。 –

3

也許只是使用Python的repr存儲的價值和使用ast.literal_eval方法反序列化:

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

這......實際上是相當合理的。但是,由於'__repr__'並不是一個序列化格式,我會厭倦使用它:它不能保證穩定,並且不會捕獲序列化錯誤(例如,試圖序列化一個' )在序列化時。 –

1

尋找同樣的事情,我發現msgpack的Python 0.4現在支持STR /與use_bin_type的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'] 
相關問題