0

我尝试使用 PHP.js 的序列化包序列化对象数据以通过 php 保存到文件中。

Chrome:很好 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() 的问题。

4

1 回答 1

0

毕竟是我自己想出来的。

当我仔细观察时,并不是 serialize() 导致错误,而是 unserialize() 与我在同一个包中。

在某些时候,缓存损坏了,由于某种原因,在 comp-mode 下的 IE9 是我测试过的唯一不能容忍它的浏览器。缓存损坏的原因是堆叠 utf8_encodes/decodes 开始搞砸了。

它是这样的:

  • 缓存是使用 serialize() 构建和序列化的。一切都好。
  • PHP 检查数据是否真的是 UTF-8 并相应地执行 utf8_encode。保存数据。一切都好。
  • 下一页加载。PHP 使用 AJAX 返回存储的数据。发送一个 UTF-8 标头以防万一。数据是 unserialize()d 并相应地处理。一切都好。
  • 缓存可能会更新新内容和 serialize()d。警告序列化数据会产生一个惊喜:中文字符和损坏代替 åäö!

解决方案在于 unserialize() 执行不必要的utf8_decode()。该页面是 UTF-8。我所有的 javascript 文件都是 UTF-8。缓存数据多次确保为 UTF-8。所以不存在也没有任何理由来解码 UTF-8。我不是 100% 确定这究竟是如何剔除数据的,但注释掉 utf8_decode 解决了这个问题。

我对现代浏览器的容错能力有点失望。它太高了。不过还好我想通了。

于 2012-09-06T06:08:02.860 回答