2015-06-22 92 views
5

我想了解,ProtoBuf.js是如何工作的?如何使用Protobuf.js解碼用於proto文件的Json格式?

的Protobuf - https://github.com/dcodeIO/ProtoBuf.js

我的原型文件gameSetting.proto樣子:

message GameSettings { 
    required string gameName = 1; 
    repeated Category categories = 2; 
} 

message Category { 
    required int32 categoryId = 1; 
    required string categoryAbbreviation = 2; 
    required string categoryName = 3; 
    required string numberInSquad = 4; 
    required string numberInTeam = 5; 
    required string captain = 6; 
} 

在這裏,我實現數據的解碼和編碼的JavaScript代碼:

var ProtoBuf = dcodeIO.ProtoBuf; 
    var protoURL = '../_doc/protobuf/gameSettings.proto'; 
    var dataURL = '../xmlapi?type=game-settings&competitionid=1&outputtype=text'; 
    var builder = ProtoBuf.loadProtoFile(protoURL, function(err, builder) { 

// WE CAN ALSO TRY USING JSON FORMAT FOR THE PROTO FILES: 
// https://github.com/dcodeIO/ProtoBuf.js/wiki/Builder#using-json-without-the-proto-parser 

// encoding test 
    var GS_build = builder.build('GameSettings'); 
    var GS = new GS_build({ 
    "gameName": "games Test 2015", 
    "categories": [{ 
    "categoryId": 1,                
    "categoryAbbreviation": "GK", 
    "categoryName": "Goalkeeper", 
    "numberInSquad": "2-2", 
    "numberInTeam": "1-1", 
    "captain": "0-1" 
    }] 
}); 


// encode various types to test 
    var GS_buffer = GS.encode(); 
    var GS_base64 = GS.encode64(); // this looks like something to use with AJAX 
    var GS_arrayBuffer = GS_buffer.toArrayBuffer(); 

// decoding test 
    var GS_buffer_decoded = GS_build.decode(GS_buffer); 
    var GS_buffer_decoded_raw = GS_buffer_decoded.toRaw(); 
    var GS_base64_decoded = GS_build.decode64(GS_base64); 
    var GS_base64_decoded_raw = GS_base64_decoded.toRaw(); 
    var GS_arrayBuffer_decoded = GS_build.decode(GS_arrayBuffer); 
    var GS_arrayBuffer_decoded_raw = GS_arrayBuffer_decoded.toRaw(); 


// decoding AJAX test 
    $.get(dataURL, function(data){ 
    var GS = GS_build.decode(data); 
    }); 
}); 

代碼// encoding test// decoding test - 工作正常。

但在代碼中的一些問題:

var GS = GS_build.decode(data) 

我怎樣才能解決這個問題?這裏

回答

5

的API是:

Message.decode(buffer:Uint8Array|ArrayBuffer|Buffer|string, encoding:string=)

encoding只有當緩衝區是一個字符串所需。因此,爲了能夠解碼一塊數據,你必須確保它是一個ArrayBuffer/Uint8Array,或者如果它是一個字符串,則提供正確的編碼。

雖然沒有任何選項,但使用jQuery的$.get可能會破壞數據。

參見:https://github.com/dcodeIO/ProtoBuf.js/wiki/How-to-read-binary-data-in-the-browser-or-under-node.js%3F

+0

它看起來並不像6.8.0存在此函數簽名。是否有替代方案或計劃添加該功能? –

相關問題