我尝试使用php.js.的序列化包将要通过php保存到文件中的对象数据序列化
铬:很好FF:好IE9:好兼容模式下的IE9(本质上是IE7):不好。
控制台错误:
SCRIPT5022: Exception thrown and not caught
serialize.min.js, line 144 character 55
序列化的数据基本上看起来是这样的:
a:180:{s:40:"Aleksis Kiven tie 15<br>04200 Kerava<br>";a:2:{i:0;d:60.4012598;i:1;d:25.09659910000005;}
未序列化:
{"Aleksis Kiven tie 15<br>04200 Kerava<br>": [60.4012598, 25.09659910000005]}
处理缓存的Javascript如下所示:
function saveCache(data) {
sdata = serialize(data);
$.ajax({
type: 'POST',
url: 'http://localhost/foobar/files/coordinates.php',
data: {
'do': 'write',
'data': sdata
}
});
}
我正在按地址将地理编码结果缓存到一个文本文件中。
如果我说不通,请多问。
主要编辑:我纠正了所指出的例子。同样重要的是,这个问题真的发生了变化;这实际上不是serialize()的问题,而是unserialize(,)的问题。
毕竟是我自己想出来的。
当我仔细查看时,导致错误的并不是serialize(),而是与我在同一个包中的unserialize(
在某个时候,缓存损坏了,出于某种原因,comp模式下的IE9是我测试过的浏览器中唯一不容忍它的浏览器。缓存损坏的原因是堆叠utf8_encoodes/decodes,开始把事情搞砸。
事情是这样的:
- 缓存是使用serialize()构建和序列化的。一切都好
- PHP检查数据是否真的是UTF-8,并相应地执行utf8_encode。保存数据。一切都好
- 下一页加载。PHP使用AJAX返回存储的数据。发送UTF-8标头只是为了以防万一。数据将被取消序列化()并进行相应处理。一切都好
- 缓存可能会使用新内容和serialize()d进行更新。提醒序列化数据会产生一个惊喜:汉字和腐败取代了åäö
解决方案在于unserialize()执行不必要的utf8_decode()。页面为UTF-8。我所有的javascript文件都是UTF-8。缓存的数据被多次确定为UTF-8。因此,不存在也没有任何理由解码UTF-8。我不能100%确定到底是如何删除数据的,但注释掉utf8_decode解决了这个问题。
我对现代浏览器的容错能力有点失望。它太高了。但好的是,我想通了。