我依靠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。