2012-11-04 76 views
2

我想用Java編寫數據並通過Javascript讀取數據。目前我使用json,但由於一個巨大的數組(雙打),這種方法很慢(解析和網絡)。在Java中高效地序列化數據並用Javascript讀取

什麼是一個很好的選擇?我發現massage pack,但這似乎有點矯枉過正,我想要做的事情。我寧願使用像base64這樣的簡單解決方案,但無法使其在JavaScript閱讀網站上工作。或者我應該使用「charset=x-user-defined method」? (效率更高嗎?)

+2

你想發送什麼類型的數據? JSON通常是一個很好的選擇,與HTTP壓縮相結合。 – Bergi

+0

如上所述:一個簡單的Json,帶有非常大的浮點數/雙精度的數組 – Karussell

+0

@Bergi我需要在Javascript端啓用http壓縮的json來啓用什麼? – Karussell

回答

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(「訪問控制 - 允許 - Origin「,」*「))和客戶端(jQuery.support.cors = true)。這裏的full working example用一個簡單的Java servlet使用DataOutputStream。作爲替代方案,還有json後備。

另一種方法是將所有數字編碼成一個字符串,並將其放入一個json(通過base64)。

我另一個令人感興趣的項目是http://binaryjs.com

0

你可以試試protobufs。 Javascript沒有正式的實現,但是至少有一些第三方的實現:Google Protocol Buffers - JavaScript

protobufs被認爲是快速的,並且具有更緊湊(非文本)表示JSON和XML。

+1

謝謝。也是在雷達上,但我寧願更容易或至少更正式的版本。 – Karussell

相關問題