解析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
相关产品推荐
相关产品推荐

