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

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

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

这很容易分别使用:

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

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

让我解释一下:

  1. 从包含应用于消息和字段的自定义选项的 proto 文件中,我想生成一个由 .NET 自定义属性修饰的 C# 类。
  2. 从一个由自定义属性修饰的 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)。你能举例说明你是如何做到这一点的吗?谢谢!

标签: c# code-generation protocol-buffers protobuf-net


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

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