Protocol Buffers(2):编码与解码

Message Structure

在上一篇文章中我们提到,对于序列化后字节流,需要回答的一个重要问题是“从哪里到哪里是哪个数据成员”。

message中每一个field的格式为:
required/optional/repeated FieldType FieldName = FieldNumber(a unique number in current message)
在序列化时,一个field对应一个key-value对,整个二进制文件就是一连串紧密排列的key-value对,key也称为tag,先上图直观感受一下,图片来自Encoding and Evolution
Example record encoded using Protocol Buffers

key由wire type和FieldNumber两部分编码而成, 具体地key = (field_number << 3) | wire_typefield_number 部分指示了当前是哪个数据成员,通过它将cc和h文件中的数据成员与当前的key-value对应起来

key的最低3个bit为wire type,**什么是wire type?**如下表所示:

wire types
wire type被如此设计,主要是为了解决一个问题,如何知道接下来value部分的长度(字节数),如果

  • wire type = 0、1、5,编码为 key + 数据,只有一个数据,可能占数个字节,数据在编码时自带终止标记
  • wire type = 2,编码为 key + length + 数据,length指示了数据长度,可能有多个数据,顺序排在length后

解码代码一窥

接下来,我们直接看一下example.pb.cc及相关的源码,看下key-value对是如何解析的。解码过程相对简单,理解了解码过程,编码也就比较显然了

// example.proto
package example;

message Person {
   
  required string name = 1;
  required int32 id = 2;
  optional string email = 3;
}
// in example.pb.cc
bool Person::MergePartialFromCodedStream(
    ::google::protobuf::io::CodedInputStream* input) {
   
#define DO_(EXPRESSION) if (!PROTOBUF_PREDICT_TRUE(EXPRESSION)) goto failure
  ::google::protobuf::uint32 tag;
  // @@protoc_insertion_point(parse_start:example.Person)
  for (;;) {
   
    ::std::pair<::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
    tag = p.first;
    if (!p.second) goto handle_unusual;
    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
   
      // required string name = 1;
      case 1: {
   
        if (static_cast< ::google::protobuf::uint8>(tag) == (10 & 0xFF)) {
    // 10 = (1 << 3) + 2
          DO_(::g
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您好,我可以提供一个同时支持JMeter测试MQTT协议和Google Protocol Buffers协议的插件,它是MQTT Protocol Plugin for JMeter。该插件可以通过添加MQTT协议支持来扩展JMeter的功能,并提供了与Google Protocol Buffers协议的兼容性。 该插件可以通过JMeter插件管理器安装。安装后,您可以使用它来创建MQTT测试计划,并在测试计划中使用Google Protocol Buffers协议进行数据交换。希望这对您有所帮助! ### 回答2: 目前,JMeter并没有提供官方的插件来测试MQTT协议和Google Protocol Buffers协议。但是,我们可以通过使用第三方插件来实现这个目标。 要测试MQTT协议,可以使用Eclipse Paho插件。Paho是一个开源的MQTT客户端库,它提供了多种编程语言的实现。要在JMeter中使用Paho插件,首先需要下载Paho的Java实现。然后将相关的JAR文件添加到JMeter的classpath中。使用JMeter的Java Request Sampler可以使用Paho库编写自定义的Java代码来测试MQTT协议。 要测试Google Protocol Buffers协议,可以使用jmeter-protobuf插件。这个插件是一个JMeter的定制扩展,可以与Google Protocol Buffers集成。要使用该插件,首先需要将jmeter-protobuf插件的JAR文件添加到JMeter的lib/ext目录中。接下来,在JMeter中创建一个ProtoBuf PreProcessor和一个ProtoBuf PostProcessor,这样就可以在发送和接收请求之前和之后对数据进行编码解码。 使用这两个插件,你可以在JMeter中编写和执行MQTT和Google Protocol Buffers测试计划。但是,请注意,这些插件需要一定的配置和编程知识来正确使用。建议查阅官方文档和示例代码,以确保正确地配置和使用插件。 总结而言,要同时测试MQTT协议和Google Protocol Buffers协议,可以使用第三方插件Eclipse Paho和jmeter-protobuf。这些插件需要额外的配置和编程知识,所以一定要仔细阅读和理解官方文档和示例代码。 ### 回答3: 目前,我所知道的一个同时用于JMeter测试MQTT协议和Google Protocol Buffers协议的插件是Eclipse Paho插件。 Eclipse Paho是一个开源的MQTT客户端库,它提供了用于连接、发布和订阅MQTT消息的API。通过集成Eclipse Paho插件,我们可以在JMeter中实现MQTT协议的测试。 同时,Google Protocol Buffers是一种跨平台、语言无关的数据序列化机制,它可以在不同的平台和环境中进行数据交换。我们可以通过使用JMeter的扩展插件,如gRPC插件或Protobuf插件,来支持Google Protocol Buffers协议的测试。 要同时使用JMeter进行MQTT协议和Google Protocol Buffers协议的测试,我们可以按照以下步骤操作: 1. 下载和安装JMeter插件管理器,使我们能够方便地管理和安装JMeter的扩展插件。 2. 在JMeter插件管理器中搜索并安装Eclipse Paho插件,这样我们就可以使用该插件进行MQTT协议的测试。 3. 同样地,在JMeter插件管理器中搜索并安装gRPC插件或Protobuf插件,这样我们就可以使用其中的功能来支持Google Protocol Buffers协议的测试。 4. 在JMeter中创建测试计划,并添加MQTT Sampler和Protobuf Sampler来模拟相应的MQTT和Google Protocol Buffers请求。 5. 配置Sampler的参数,如服务器地址、端口号、订阅主题、发送的消息等等,以便进行相应的测试。 6. 运行测试计划,观察并分析测试结果,以评估系统在处理MQTT和Google Protocol Buffers协议时的性能。 总之,通过集成Eclipse Paho插件和适当的JMeter扩展插件,我们可以实现同时测试MQTT和Google Protocol Buffers协议的功能,并评估系统的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值