2015-06-22 29 views
5

Sto cercando di capire, come funziona lo ProtoBuf.js?Come decodificare Json Format per i file proto usando Protobuf.js?

protobuf - https://github.com/dcodeIO/ProtoBuf.js

Il mio file proto gameSetting.proto assomiglia:

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; 
} 

Ecco, io sono l'attuazione del codice JavaScript con la decodifica e la codifica dei dati:

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); 
    }); 
}); 

Il codice // encoding test e // decoding test - funziona bene.

Ma c'è qualche problema nel codice:

var GS = GS_build.decode(data) 

Come posso risolvere il problema?

risposta

5

L'API ecco:

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

con encoding necessaria solo se il buffer è una stringa. Quindi, per essere in grado di decodificare una porzione di dati, è necessario assicurarsi che sia un ArrayBuffer/Uint8Array o, se si tratta di una stringa, fornire la codifica corretta.

L'uso di jQuery $.get senza alcuna opzione probabilmente corromperà i dati.

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

+0

non sembra in questo modo la firma funzione esiste in 6.8.0. C'è un'alternativa o un piano per aggiungere la funzionalità? –