改行またはタブを含む文字列、正規表現及びそれらを含む配列、オブジェクトをシリアライズした時、その結果を正しくデシリアライズできない。 #193

Closed
fukudayasuo opened this Issue Apr 17, 2013 · 1 comment

Comments

Projects
None yet
2 participants
@fukudayasuo

h5.lapi.storage.local.setItem/getItem で改行またはタブを含む値を正しく復元できないのも同様の問題である。
(内部でserialize/deserializeをしているため。)

改行を含む文字列をシリアライズすると、その結果に改行文字が含まれる。
改行文字を含むシリアライズ済み文字をデシリアライズしようとすると、最初の改行文字以降が無視されてしまう。

var str = $('pre').text(); // 改行を含む文字列
var serialized = h5.u.obj.serialize(str);
var result = h5.u.obj.deserialze(serialized); 
// 最初の改行以降が無視された結果になる

配列やオブジェクトの中に改行含む文字列がある場合は、JSON.parseができずにエラーが投げられる。
(FWではオブジェクト、配列にパースするときに$.parseJSON()を使用している。)
($.parseJSON()ではwindow.JSON.parseがある場合はそれを使用している。)

window.JSON.stringifyでは改行文字は"\r\n"に変換して、window.JSON.parseで改行に復元される。シリアライズ/デシリアライズも同様に、シリアライズ時にエスケープするように修正する。

@ghost ghost assigned fukudayasuo Apr 17, 2013

fukudayasuo pushed a commit to hifive-labs/hifivemain that referenced this issue Apr 17, 2013

@fukudayasuo

This comment has been minimized.

Show comment
Hide comment
@fukudayasuo

fukudayasuo Apr 17, 2013

シリアライズのバージョンを1→2に変更しました。

シリアライズ時に、, \b, \f, \n, \r, \t をエスケープし、デシリアライズで復元するようにしました。そのため、エスケープされる文字がある場合にバージョン1とバージョン2でシリアライズの結果が変わります。

デシリアライズにはバージョン1との後方互換があり、バージョン1でシリアライズされた文字列も現在のデシリアライズで復元できます。

バージョン1でシリアライズされたものは、アンエスケープせずにデシリアライズするようにしています。

シリアライズのバージョンを1→2に変更しました。

シリアライズ時に、, \b, \f, \n, \r, \t をエスケープし、デシリアライズで復元するようにしました。そのため、エスケープされる文字がある場合にバージョン1とバージョン2でシリアライズの結果が変わります。

デシリアライズにはバージョン1との後方互換があり、バージョン1でシリアライズされた文字列も現在のデシリアライズで復元できます。

バージョン1でシリアライズされたものは、アンエスケープせずにデシリアライズするようにしています。

fukudayasuo pushed a commit to hifive-labs/hifivemain that referenced this issue Apr 18, 2013

fukudayasuo
#193 ソースコードリファクタ。
テストコードにデバッグ時に埋めたconsole.logが残っていたので消去

fukudayasuo pushed a commit to hifive-labs/hifivemain that referenced this issue Apr 18, 2013

@simdy simdy closed this Apr 23, 2013

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment