我的目标与中所述完全相同这个问题在github上 https://github.com/protocolbuffers/protobuf/issues/6853:
如何读取现有的 .proto 文件并从中获取 FileDescriptor
我无法使用建议的“解决方法”,原因有两个:
- I have "plain" .proto files, i.e.:
- 它们是文本文件,就像旧的一样地址簿.proto https://github.com/protocolbuffers/protobuf/blob/master/examples/addressbook.proto
- 他们不是自我描述 https://developers.google.com/protocol-buffers/docs/techniques#self-description
- 我不想将协议编译器作为外部应用程序调用。
根据马克的说法 https://stackoverflow.com/a/47635433/11398730这是可能的protobuf网络 https://github.com/protobuf-net/protobuf-net图书馆:
如果没有编译的模式,您将需要一个运行时 .proto 解析器。 [...] protobuf-net 包括一个(protobuf-net.Reflection https://www.nuget.org/packages/protobuf-net.Reflection/)
I found Parsers.cs https://github.com/protobuf-net/protobuf-net/blob/main/src/protobuf-net.Reflection/Parsers.cs
谢谢马克,但我该如何使用/执行此操作?
这是正确的切入点吗?
某处有一个最小的工作示例吗?
var set = new FileDescriptorSet();
set.Add("my.proto", true);
set.Process();
这就是你所需要的;请注意,如果您想提供实际内容(而不是让库进行文件访问),则有一个可选的TextReader
范围。如果您需要进口:
set.AddImportPath(...);
一旦你打过电话Process
, the .Files
应与.MessageTypes
每个文件等
更完整的例子:
var http = new HttpClient();
var proto = await http.GetStringAsync(
"https://raw.githubusercontent.com/protocolbuffers/protobuf/master/examples/addressbook.proto");
var fds = new FileDescriptorSet();
fds.Add("addressbook.proto", true, new StringReader(proto));
fds.Process();
var errors = fds.GetErrors();
Console.WriteLine($"Errors: {errors.Length}");
foreach(var file in fds.Files)
{
Console.WriteLine();
Console.WriteLine(file.Name);
foreach (var topLevelMessage in file.MessageTypes)
{
Console.WriteLine($"{topLevelMessage.Name} has {topLevelMessage.Fields.Count} fields");
}
}
哪个输出:
addressbook.proto
Person has 5 fields
AddressBook has 1 fields
google/protobuf/timestamp.proto
Timestamp has 2 fields
请注意,您不必提供timestamp.proto
或其导入路径 - 该库嵌入了许多常见的导入,并使其自动可用。
(每个文件是一个FileDescriptorProto
;逻辑解析操作中的文件组是FileDescriptorSet
- 这是使用的根对象描述符.proto https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/descriptor.proto;请注意,如果您需要编译/二进制模式,则此图中的所有对象也是 protobuf 可序列化的)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)