从 proto 文件生成 C#,反之亦然解释自定义选项

Posted

技术标签:

【中文标题】从 proto 文件生成 C#,反之亦然解释自定义选项【英文标题】:Generate C# from proto files and vice versa interpreting custom options 【发布时间】:2011-03-28 11:43:54 【问题描述】:

我正在使用protobuf-net,我正在尝试:

    从 .proto 文件生成 C# 类 从 C# 类生成 .proto 文件

这很容易分别使用:

    protogen.exe工具 Serializer<T>.GetProto()方法

但问题是我需要支持 protobuffer custom options,而且它似乎不像我那么简单。

让我解释一下:

    从包含应用于消息和字段的自定义选项的 proto 文件中,我想生成一个由 .NET 自定义属性修饰的 C# 类。 从一个由自定义属性修饰的 C# 类,我想生成一个原型文件,其中自定义选项应用于消息和字段。

基本上,给定:

message person 
   option (my_message_option) = true;

   optional string firstname = 1 [(my_field_option) = 42];
   optional string lastname = 2 [(my_field_option) = 12];
   optional int age = 3;

我要生成:

[ProtoContract, MyMessageOption(true)]
public class Person

    [ProtoMember(1), MyFieldOption(42)]
    public string Firstname;

    [ProtoMember(2), MyFieldOption(12)]
    public string Firstname;

    [ProtoMember(3)]
    public string Firstname;

...反之亦然。

注意事项:

自定义选项定义 (my_message_optionmy_field_option) 可能已经存在 在原型文件中(例如, my_custom_options.proto),以及 自定义属性类也可以 存在于某处 (MyMessageOptionAttributeMyFieldOptionAttribute)。 我尝试使用 protogen.exe 和 自定义 xslt 但 protogen 似乎没有 支持自定义选项。

实现这一目标的首选方法是什么? 解决方案不必依赖 protobuf-net。

【问题讨论】:

我想做同样的事情,从 proto 文件生成修饰的 C# 文件(用于 protobuf-net)。你能举例说明你是如何做到这一点的吗?谢谢! 【参考方案1】:

我最终从 protobuf-csharp 分叉了 ProtoGen 项目,以公开一些内部类型(大部分是生成器)并通过允许自定义生成器注册使 SourceGenerators 可扩展。

通过这种方式,我能够使用原型描述符对象模型来编写自己的 C# 生成器。

一个棘手的问题是在启动解析之前注册您的自定义选项类型:

    根据您的自定义选项生成 C# 类型(使用Protoc.exe 然后ProtoGen.exe) 使用生成的RegisterAllExtensions 方法配置ExtensionRegistry。 使用您自己的 C# 生成器开始代码生成。在每个生成器中,您都可以访问上下文 Descriptor.Options 集合。

【讨论】:

【参考方案2】:

目前没有简单的方法可以做到这一点。所需的更改主要针对 csharp.xslt 文件。有一个关于此的错误reported,但尚未修复。

【讨论】:

我已经尝试创建一个特定的 xslt 文件,但我无法访问 proto 文件中使用的自定义选项。你能想到另一种不基于 protobuf-net 的解决方案吗? @Romain 这不是我有机会看到的配置,所以:不是我的头顶,不。如果你通过 xml 模板(-t:xml 或类似的东西)运行它,它会告诉你它知道什么,这可能表明这些数据潜伏在哪里 - 假设它不需要更新描述符。 是的,这就是我尝试过的 (-t:xml),但所有自定义选项在生成的 xml 文件中都显示为 uninterpreted_option

以上是关于从 proto 文件生成 C#,反之亦然解释自定义选项的主要内容,如果未能解决你的问题,请参考以下文章

在预构建事件中使用 protogen 从 .proto 文件生成 c# 文件

获取自定义构建工具来创建 C# 文件

protobuf 下载编译,拷贝,proto文件生成c# c++代码

protobuf 下载编译,拷贝,proto文件生成c# c++代码

protobuf 下载编译,拷贝,proto文件生成c# c++代码

protobuf-net - 反引号、字典和 .proto 文件