Python2.3から2.4でmarshal形式データが変更¶
Python2.4で動かしているZopeのgadflyで保存したデータファイルをPython2.3で動かしているZopeでロードしようとしたら、フォーマット異常でロードできませんでした。調べてみたところPython2.4でmarshalモジュールの保存フォーマットが変更になっていました。
gadflyのデータファイルの変換方法について gadflyのデータフォーマット にまとめてみました。
以下のコードで、Python2.3と2.4で作ったmarshalの出力ファイルを相互に読み込ませてみたところ、2.3で作ったファイルは2.4で読み出せるようです。
import marshal
import sys
sv = ''.join([str(x) for x in sys.version_info[0:3]])
a = [1, 2.3, 'abc', u'uni', (4,5), {6:'7'}]
marshal.dump(a, file( 'marshal_'+sv+'.msl', 'w'))
import glob
gl = glob.glob('./*.msl')
for f in gl:
print '%s loading...' % f,
try:
marshal.load(file(f,'r'))
print 'OK'
except:
print 'NG'
実行するとこんな感じです。
リリースノート等にこのフォーマット変更は書かれていませんでしたが、 Python2.4のライブラリリファレンス には関係ありそうな変更を発見しました。
まぁ、永続化のためにmarshal使うな、って書いてあるのでこの影響を受ける人はほとんどいないはず...。