解析Base64编码模式时,获取协议消息end-group标签与期望的标签不匹配



我依靠Confluent的模式注册表来存储我的protobuf模式。

我在模式注册表中发布了以下模式:

{
"schema": "syntax = 'proto3'; package com.xyz.message; option java_package = 'com.xyz.message'; option java_outer_classname = 'ActionMessage'; message Action { reserved 7; string id = 1; string version = 2; string action_name = 3; string unique_event_i_d = 4; string rule_i_d = 5; map<string, Value> parameters = 6; string secondary_id = 8; message Value { string value = 1; repeated string values = 2;  } }",
"schemaType" : "PROTOBUF"
}

然后我从我的应用程序中查询模式注册表REST API来检索它

...
JsonElement schemaRegistryResponse = new JsonParser().parse(inputStreamReader);
String schema = schemaRegistryResponse.getAsJsonObject().get("schema").getAsString();

这确实使schema变量,该变量持有包含protobuf模式的字符串。现在我想创建一个com.google.protobuf.Descriptors.Descriptor

我按如下步骤进行:

byte[] encoded = Base64.getEncoder().encode(schema.getBytes());
FileDescriptorSet set = FileDescriptorSet.parseFrom(encoded);
FileDescriptor f = FileDescriptor.buildFrom(set.getFile(0), new FileDescriptor[] {});
Descriptors.Descriptor descriptor = f.getMessageTypes().get(0);

然而,这会抛出协议消息end-group标签与预期标签不匹配调用parseFrom(encoded)异常方法。

知道我可能做错了什么吗?

您正在尝试解析.proto文件的base64编码表示。这完全不是FileDescriptorSet.parseFrom所期望的。它期望FileDescriptorSet消息的protobuf二进制表示,它通常由protoc使用descriptor_set_out选项创建。

我不相信有任何方法可以让protobuf库解析.proto文件的文本-你真的需要运行protoc。

最新更新