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

时间:2011-03-28 11:43:55

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

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

  1. 从.proto文件生成C#类
  2. 从C#类生成.proto文件
  3. 分别使用它很容易:

    1. protogen.exe工具
    2. Serializer<T>.GetProto()方法
    3. 但问题是我需要支持protobuffer custom options并且它似乎并不像我那样直截了当。

      让我解释一下:

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

        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)已经存在 在一个protofile(说, my_custom_options.proto)和 自定义属性类也可以 存在于某个地方 (MyMessageOptionAttributeMyFieldOptionAttribute)。
        • 我尝试使用protogen.exe和a 自定义xslt但似乎没有原子 支持自定义选项。

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

2 个答案:

答案 0 :(得分:2)

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

这样,我就可以使用proto描述符对象模型来编写自己的C#生成器。

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

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

答案 1 :(得分:1)

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