[英]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.