簡體   English   中英

從proto文件生成C#,反之亦然解釋自定義選項

[英]Generate C# from proto files and vice versa interpreting custom options

我正在使用protobuf-net ,我正在嘗試:

  1. 從.proto文件生成C#類
  2. 從C#類生成.proto文件

這分別很容易使用:

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

但問題是我需要支持protobuffer 自定義選項 ,但它似乎並不像我那樣簡單。

讓我解釋:

  1. 從包含應用於消息和字段的自定義選項的proto文件,我想生成一個由.NET自定義屬性修飾的C#類。
  2. 在自定義屬性修飾的C#類中,我想生成一個proto文件,其中自定義選項應用於消息和字段。

基本上,給出:

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和自定義xslt,但protogen似乎不支持自定義選項。

實現這一目標的首選方式是什么? 解決方案不必依賴protobuf-net。

我最后通過從protobuf-csharp分配ProtoGen項目來公開一些內部類型(生成器,大部分),並通過允許自定義生成器注冊使SourceGenerators可擴展。

這樣,我就可以使用proto描述符對象模型來編寫自己的C#生成器。

一個棘手的問題是在啟動解析之前注冊自定義選項類型:

  1. 生成與您的自定義選項對應的C#類型(使用Protoc.exe然后是ProtoGen.exe
  2. 使用生成的RegisterAllExtensions方法配置ExtensionRegistry
  3. 使用您自己的C#生成器啟動代碼生成。 在每個生成器中,您可以訪問上下文Descriptor.Options集合。

目前沒有一種簡單的方法可以做到這一點。 所需的更改主要是csharp.xslt文件。 有關此報告的錯誤但尚未修復。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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