[英]How to parse .proto file into a FileDescriptor in C#?
我的目标与本期 github中所述的完全相同:
如何读取现有的.proto 文件并从中获取 FileDescriptor
我不能使用建议的“解决方法”,原因有两个:
根据 Marc的说法,这可以通过protobuf-net库实现:
如果没有编译的模式,您将需要一个 runtime.proto 解析器。 [...] protobuf-net 包括一个( protobuf-net.Reflection )
我找到Parsers.cs
谢谢 Marc,但我该如何使用/执行此操作? 这是正确的切入点吗? 某处有最小的工作示例吗?
var set = new FileDescriptorSet(); set.Add("my.proto", true); set.Process();
这就是你所需要的; 请注意,如果您想提供实际内容(而不是让库进行文件访问),则有一个可选的TextReader
参数。 如果您需要进口:
set.AddImportPath(...);
一旦你调用了Process
, .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
- 这是从descriptor.proto使用的根 object ;请注意,此图中的所有对象也是 protobuf 可序列化的,如果您需要编译/二进制模式)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.