簡體   English   中英

如何將.proto 文件解析為 C# 中的 FileDescriptor?

[英]How to parse .proto file into a FileDescriptor in C#?

我的目標與本期 github中所述的完全相同:

如何讀取現有的.proto 文件並從中獲取 FileDescriptor

我不能使用建議的“解決方法”,原因有兩個:

  • 我有“普通”.proto 文件,即:
  • 我不想將 protoc 編譯器作為外部應用程序調用。

根據 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM