【问题标题】:Efficiently serialize data in Java and read with Javascript在 Java 中高效序列化数据并使用 Javascript 读取
【发布时间】:2012-10-24 10:46:51
【问题描述】:

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

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

【问题讨论】:

  • 您要发送什么类型的数据? JSON 通常是一个不错的选择,结合 HTTP 压缩。
  • 如前所述:一个简单的 json,具有非常大的浮点数/双精度数组
  • @Bergi 我必须在 Javascript 端启用什么才能读取 http 压缩 json?
  • 浏览器自动解压..你需要在服务器端做的就是使用gzip压缩响应,然后发送标题Content-Encoding: gzip使其工作
  • @Esailija 谢谢。但我宁愿不依赖客户支持。或者至少我会支持 gzip 和二进制数据。

标签: java javascript serialization base64


【解决方案1】:

嗯,我对现有的解决方案不满意(使用简单 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) 上启用它=真)。这里full working example 带有一个使用DataOutputStream 的简单Java servlet。作为替代方案,还有 json 后备。

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

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

【讨论】:

    【解决方案2】:

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

    Protobufs 以速度快而著称,并且比 JSON 和 XML 具有更紧凑(非文本)的表示形式。

    【讨论】:

    • 谢谢。也在雷达上,但我更喜欢更简单或至少更正式的版本。
    猜你喜欢
    • 2021-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-11
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多