Javascript 如何使用Protobuf.js解码proto文件的Json格式?

Javascript 如何使用Protobuf.js解码proto文件的Json格式?,javascript,protocol-buffers,decode,encode,Javascript,Protocol Buffers,Decode,Encode,我试图理解,ProtoBuf.js是如何工作的 var ProtoBuf = dcodeIO.ProtoBuf; var protoURL = '../_doc/protobuf/gameSettings.proto'; var dataURL = '../xmlapi?type=game-settings&competitionid=1&outputtype=text'; var builder = ProtoBuf.loadProtoFile( protoUR

我试图理解,
ProtoBuf.js
是如何工作的

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

  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 );   
  });
});
我的proto文件
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;
}
  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 );   
  });
});
在这里,我使用数据解码和编码实现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 );   
  });
});
代码
//编码测试
//解码测试
工作正常

  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 );   
  });
});
但代码中存在一些问题:

  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 );   
  });
});
var GS = GS_build.decode( data ) 
我怎样才能修好它

这里的API是:

  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 );   
  });
});
Message.decode(缓冲区:Uint8Array | ArrayBuffer | buffer | string,编码:string=)

  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 );   
  });
});
仅当缓冲区是字符串时,才需要使用
编码。因此,为了能够解码数据块,您必须确保它是ArrayBuffer/Uint8Array,或者如果是字符串,则提供正确的编码

  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 );   
  });
});
但是,使用jQuery的
$.get
而不使用任何选项可能会损坏数据

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

另请参见:

6.8.0中似乎不存在此函数签名。是否有替代方案或计划重新添加该功能?
  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 );   
  });
});