protobufjs : encoding/decoding 一条包含 Any 组件的消息
protobufjs : encoding/decoding a message that has an Any component
我正在使用 protobufjs 6.6.3(运行 在 nodejs 6.9.1 上)
简而言之,我正在尝试 encode/decode 包含 Any 类型组件的消息,我想知道我是否做对了...
syntax = "proto3";
import "google/protobuf/any.proto";
package myTest;
message TestMessage {
string message = 1;
google.protobuf.Any details = 2;
}
我最初的问题是:当我解码 TestMessage 类型的消息时发生了什么:它是否也自动解码 Any 部分,还是我需要这样做 'manually'?
简而言之,这就是我所做的:
- 创建了一条新消息
- 将其附加到 TestMessage 消息中
- encode/decode TestMessage消息;然后,解码 TestMessage
的 Any 部分
代码:
const protobuf = require('protobufjs');
const protoFile = __dirname + '/testAnyProto.proto';
function AnyMessageType(properties) {
protobuf.Message.call(this, properties); // call the super constructor
}
var root = protobuf.loadSync(protoFile);
protobuf.Class.create(root.lookup('google.protobuf.Any'), AnyMessageType);
var sampleBuffer = new Buffer('ABCDEF', 'utf8');
var sampleAny = new AnyMessageType({
type_url: "some.type",
value: sampleBuffer
});
var sampleAnyEncodedBuffer = AnyMessageType.encode(sampleAny).finish();
var sampleAnyEncodedDecoded = AnyMessageType.decode(sampleAnyEncodedBuffer);
//just checking if I am getting back 'ABCDEF' and... I am
console.log(sampleAnyEncodedDecoded.value.toString('utf8'));
var TestMessageType = root.lookup('myTest.TestMessage');
// Create a new message
var testMessage = TestMessageType.create({
message: 'Some message',
details: sampleAny //??? when I decode a testMessage, it creates an AnyMessageType, so I assume I am right
});
var encodedTestMessage = TestMessageType.encode(testMessage).finish();
var decodedEncodedTestMessage = TestMessageType.decode(encodedTestMessage);
console.log(decodedEncodedTestMessage.details.value.toString('utf8'));
好的...所以,问题:
- 当我构建 TestMessage 时,details 预计(根据协议)填充 AnyMessage 消息,而不是编码的 AnyMessage 消息,对吗?
- 编码的 TestMessage 消息的解码不会自动解码 AnyMessage 组件(详细信息),对吗?至少,在我看来是这样的...
- 最让我困惑的是什么,因此我需要上述确认...我应该在哪里使用 AnyMessage encoding/decoding(我的意思是 sampleAnyEncodedBuffer = AnyMessageType.encode( sampleAny).finish() 调用和 decode 一个)?仅用于 encoding/decoding 简单的 AnyMessage(简单的意思是不属于 'parent' 消息)?
让我这样说:我正在尝试匹配现有的 Java pack/unpack 函数。在我的示例中,我现在 'associating' 这些带有缓冲区<->字符串转换(见我最后的 console.log 行),我不认为需要调用 AnyMessageType.decode...我错了吗?
Java pack-unpack 在 Any
传输 中编码的另一个 protobuf 消息时使用 。当您的 Any
仅传输一个字符串时,您显然不需要调用任何解码。你的 decode/unpack 是 value.toString('utf-8')
。您正在直接访问 Any
的成员 type_url
和 value
,这是 Java 的 pack-unpack 对您的抽象。
如果您想在 details
中传输 protobuf ThatMessageType
而不是简单的字符串,那么您需要 ThatMessageType.encode()
而不是仅仅创建一个缓冲区,并且 ThatMessageType.decode()
而不是调用 toString
.
我正在使用 protobufjs 6.6.3(运行 在 nodejs 6.9.1 上) 简而言之,我正在尝试 encode/decode 包含 Any 类型组件的消息,我想知道我是否做对了...
syntax = "proto3";
import "google/protobuf/any.proto";
package myTest;
message TestMessage {
string message = 1;
google.protobuf.Any details = 2;
}
我最初的问题是:当我解码 TestMessage 类型的消息时发生了什么:它是否也自动解码 Any 部分,还是我需要这样做 'manually'?
简而言之,这就是我所做的:
- 创建了一条新消息
- 将其附加到 TestMessage 消息中
- encode/decode TestMessage消息;然后,解码 TestMessage 的 Any 部分
代码:
const protobuf = require('protobufjs');
const protoFile = __dirname + '/testAnyProto.proto';
function AnyMessageType(properties) {
protobuf.Message.call(this, properties); // call the super constructor
}
var root = protobuf.loadSync(protoFile);
protobuf.Class.create(root.lookup('google.protobuf.Any'), AnyMessageType);
var sampleBuffer = new Buffer('ABCDEF', 'utf8');
var sampleAny = new AnyMessageType({
type_url: "some.type",
value: sampleBuffer
});
var sampleAnyEncodedBuffer = AnyMessageType.encode(sampleAny).finish();
var sampleAnyEncodedDecoded = AnyMessageType.decode(sampleAnyEncodedBuffer);
//just checking if I am getting back 'ABCDEF' and... I am
console.log(sampleAnyEncodedDecoded.value.toString('utf8'));
var TestMessageType = root.lookup('myTest.TestMessage');
// Create a new message
var testMessage = TestMessageType.create({
message: 'Some message',
details: sampleAny //??? when I decode a testMessage, it creates an AnyMessageType, so I assume I am right
});
var encodedTestMessage = TestMessageType.encode(testMessage).finish();
var decodedEncodedTestMessage = TestMessageType.decode(encodedTestMessage);
console.log(decodedEncodedTestMessage.details.value.toString('utf8'));
好的...所以,问题:
- 当我构建 TestMessage 时,details 预计(根据协议)填充 AnyMessage 消息,而不是编码的 AnyMessage 消息,对吗?
- 编码的 TestMessage 消息的解码不会自动解码 AnyMessage 组件(详细信息),对吗?至少,在我看来是这样的...
- 最让我困惑的是什么,因此我需要上述确认...我应该在哪里使用 AnyMessage encoding/decoding(我的意思是 sampleAnyEncodedBuffer = AnyMessageType.encode( sampleAny).finish() 调用和 decode 一个)?仅用于 encoding/decoding 简单的 AnyMessage(简单的意思是不属于 'parent' 消息)?
让我这样说:我正在尝试匹配现有的 Java pack/unpack 函数。在我的示例中,我现在 'associating' 这些带有缓冲区<->字符串转换(见我最后的 console.log 行),我不认为需要调用 AnyMessageType.decode...我错了吗?
Java pack-unpack 在 Any
传输 中编码的另一个 protobuf 消息时使用 。当您的 Any
仅传输一个字符串时,您显然不需要调用任何解码。你的 decode/unpack 是 value.toString('utf-8')
。您正在直接访问 Any
的成员 type_url
和 value
,这是 Java 的 pack-unpack 对您的抽象。
如果您想在 details
中传输 protobuf ThatMessageType
而不是简单的字符串,那么您需要 ThatMessageType.encode()
而不是仅仅创建一个缓冲区,并且 ThatMessageType.decode()
而不是调用 toString
.