当前位置: 首页 > 知识库问答 >
问题:

如何在C#中将. proto文件解析为FileDescriptor?

简滨海
2023-03-14

我的目标与本期github上所述完全相同:

如何读取现有的. proto文件并从中获取FileDescriptor

我不能使用建议的“变通方法”,原因有二:

  • 我有“普通”. proto文件,即:
    • 它们是文本文件,就像好的旧addressbook.proto
    • 他们不是自我描述

    根据Marc的说法,这是可能的,使用协议库:

    如果没有编译的模式,您将需要一个运行时。原型解析器。[...] protobuf net包括一个(protobuf net.Reflection)

    我找到了解析器。cs

    谢谢你,马克,但是我该怎么用/怎么做呢?这是正确的入口吗?是否有一个最小的工作示例?

共有1个答案

丁俊智
2023-03-14
var set = new FileDescriptorSet();
set.Add("my.proto", true);
set.Process();

这就是你所需要的;请注意,如果要提供实际内容(而不是让库进行文件访问),则有一个可选的TextReader参数。如果需要导入:

set.AddImportPath(...);

调用进程后,。文件应与一起填充。每个文件的消息类型等。

更完整的例子:

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

请注意,您不必提供时间戳。proto或其导入路径-库嵌入了许多常用导入,并使它们自动可用。

(每个文件都是一个FileDescriptorProto;逻辑解析操作中的文件组是FileDescriptorSet——它是从descriptor.proto使用的根对象;请注意,如果需要编译/二进制模式,此图中的所有对象也是protobuf可序列化的)

 类似资料:
  • 问题内容: 有谁知道在Python中使用C头文件的好方法吗?例如,我有一个包含全局变量的C程序: 我希望能够采用C编译器/链接器生成的二进制文件,并使用Python脚本解析此结构(并可能对其进行修改)。 问题答案: 看一下用Python编写的C ++标头解析器 。您还可以使用以下任何一种工具编写自己的解析器: 剖析 层 勒普 还有更多…

  • 问题内容: 我正在尝试动态解析Java中的给定.proto文件,以解码Protobuf编码的二进制文件。 我有以下解析方法,其中“ proto”字符串包含.proto文件的内容: 但是,执行时,先前的方法将引发消息“协议消息标签的电线类型无效”的异常。我使用了来自Google的示例.proto文件,因此我认为它是有效的:https : //github.com/google/protobuf/bl

  • 问题内容: 您能否告诉我如何传递如下所示的JSON字符串: 我这样尝试过: 提前致谢 最好的祝福 问题答案: 请注意,您的JSON数据具有以下结构: 顶级值是具有单个属性(称为“课程”)的对象(字典) “教训”属性是一个数组 “课程”数组中的每个元素都是一个具有几个属性的对象(包含课程的字典),其中包括“眩晕” 相应的代码是: 一些观察: 在中,参数是指向指针的指针。在这种情况下,通常使用代替。如

  • 问题内容: 我正在研究一个很长的Bash脚本。我想将CSV文件中的单元格读取到Bash变量中。我可以解析行和第一列,但不能解析其他任何列。到目前为止,这是我的代码: 它仅打印第一列。作为附加测试,我尝试了以下操作: $ y是空的。所以我尝试了: $ y是。为什么? 问题答案: 您需要使用而不是: 请注意,对于一般用途的CSV解析,您应该使用专门的工具,该工具可以处理带有内部逗号的带引号的字段,以及

  • 问题内容: 如何在Python中解析YAML文件? 问题答案: 不依赖标头的最简单,最纯净的方法是(文档),可以通过以下方式安装: 就是这样。一个普通的函数也存在,但是除非你明确需要提供的任意对象序列化/反序列化,以避免引入执行任意代码的可能性,否则通常应首选该函数。

  • 我有一个XML文件,如 我需要值,即“OEBPS/content.opf”文本。我尝试使用文档生成器和XML解析器,但没有结果。如何遍历该节点并获取值