2

我想用 Java 编写数据并通过 Javascript 读回。目前我正在使用 json 但由于一个巨大的数组(双打),这种方法很慢(解析和网络)。

什么是好的选择?我找到了按摩包,但这对于我正在尝试做的事情似乎有点矫枉过正。我宁愿使用像 base64 这样的简单解决方案,但无法使其在 javascript 阅读网站上运行。还是我应该使用“ charset=x-user-defined method ”?(效率更高吗?)

4

2 回答 2

0

你可以试试protobufs。Javascript 没有官方实现,但(至少)有几个 3rd-party 实现: Google Protocol Buffers - JavaScript

与 JSON 和 XML 相比,Protobufs 被认为既快速又具有更紧凑(非文本)的表示形式。

于 2012-11-04T11:55:48.930 回答
0

好吧,我对现有的解决方案不满意(使用简单 json 时开销太大或太慢)。所以在这里,为了记录,一个通过'arraybuffer'的html5解决方案

    var xhr = new XMLHttpRequest();
    xhr.open('GET', url, true);
    xhr.responseType = 'arraybuffer';
    xhr.onload = function(e) {
        if (this.status == 200) {
            var dv = new DataView(this.response);
            var json = {
                "info" : {
                    "took" : 0
                },
                "route": {
                    "time": 0, 
                    "distance": 0, 
                    "data" : {}
                }
            };

            var i = 0;
            json.info.took = dv.getFloat32(i);                
            i += 4;
            json.route.distance = dv.getFloat32(i);
            i += 4;
            json.route.time = dv.getInt32(i);
            i += 4;
            var locations = dv.getInt32(i);
            var tmpArray = [];
            json.route.data = {
                "type" : "LineString",
                "coordinates": tmpArray
            };
            for(var index = 0; index < locations; index ++) {
                i += 4;
                var lat = dv.getFloat32(i);
                i += 4;
                var lng = dv.getFloat32(i);
                tmpArray.push([lng, lat]);
            }            
            callback(json);
        } else
            errCallback(e);
    };
    xhr.send();

要使其与跨源策略一起使用,您需要在服务器 (response.setHeader("Access-Control-Allow-Origin", "*")) 和客户端 (jQuery.support.cors = true) 上启用它. 这是使用 DataOutputStream 的简单 Java servlet的完整工作示例。作为替代方案,还有 json 后备。

另一种方法是将所有数字编码为字符串并将其放入 json(通过 base64)。

我偶然发现的另一个有趣的项目是http://binaryjs.com

于 2012-11-04T20:01:08.027 回答