You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解析Base64编码Protobuf schema报end-group tag不匹配错误如何解决

错误原因
  • Confluent Schema Registry 标准REST接口返回的schema字段为明文Protobuf IDL文本,并非序列化后的FileDescriptorSet二进制数据。FileDescriptorSet.parseFrom()仅支持解析FileDescriptorSet消息序列化后的二进制流,无法直接识别IDL文本格式的输入。
  • Base64操作逻辑颠倒。如果输入源为Base64编码后的FileDescriptorSet二进制,需要先做Base64解码得到原始二进制再传入parseFrom(),而非将普通文本编码为Base64。
  • 你传入的Base64编码后的IDL文本二进制完全不符合Protobuf消息的编码规范,解析时字段标签校验失败,因此抛出对应异常。
正确实现方案

方案1:基于返回的IDL文本编译生成Descriptor

需要引入Protobuf解析相关依赖,示例依赖如下:

<dependency>
    <groupId>com.google.protobuf</groupId>
    <artifactId>protobuf-java</artifactId>
    <version>对应版本</version>
</dependency>
<dependency>
    <groupId>io.protostuff</groupId>
    <artifactId>protostuff-parser</artifactId>
    <version>对应版本</version>
</dependency>

代码示例:

// 从接口获取到的明文IDL字符串
String protoIdl = schemaResponse.getSchema();
// 解析IDL文本
ProtoParser parser = ProtoParser.newInstance();
ProtoFile protoFile = parser.parse(protoIdl);
// 转换为Google原生FileDescriptor
FileDescriptor fileDescriptor = FileDescriptorFactory.create(protoFile);
// 按消息名称获取目标Descriptor
Descriptor targetDescriptor = fileDescriptor.findMessageTypeByName("你的消息类型名称");

方案2:使用Confluent官方客户端直接获取Descriptor

直接引入Confluent Schema Registry官方客户端可以省去手动解析逻辑:

<dependency>
    <groupId>io.confluent</groupId>
    <artifactId>kafka-schema-registry-client</artifactId>
    <version>对应版本</version>
</dependency>

代码示例:

// 初始化客户端
SchemaRegistryClient client = new CachedSchemaRegistryClient("http://你的SchemaRegistry地址:端口", 100);
// 通过schema ID获取schema,也可按subject+版本获取
ParsedSchema schema = client.getSchemaById(schemaId);
if (schema instanceof ProtobufSchema) {
    Descriptor descriptor = ((ProtobufSchema) schema).toDescriptor();
}

内容的提问来源于stack exchange,提问作者nmpg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 00:15:03