Создание C# из файлов proto и наоборот интерпретация пользовательских параметров

я использую protobuf-чистая, и я пытаюсь:

  1. создайте класс C# из a .proto file
  2. создать .файл proto из класса C#

это довольно легко использовать соответственно:

  1. protogen.exe инструмент
  2. Serializer<T>.GetProto() метод

но дело в том, что мне нужно поддержать protobuffer пользовательские параметры и это, похоже, не так прямолинейно,как и я.

поясню:

  1. из файла proto, содержащего пользовательские параметры, применяемые к сообщениям и полям, я хочу создать класс C#, украшенный пользовательскими атрибутами .NET.
  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_option и my_field_option) уже может существовать в протофайле (скажем, my_custom_options.прото), и классы пользовательских атрибутов также могут существовать где-то (MyMessageOptionAttribute и MyFieldOptionAttribute).
  • Я пытался использовать protogen.exe и пользовательский xslt, но protogen не кажется поддержка пользовательских параметров.

каков предпочтительный способ достичь этого? решение не должно полагаться на protobuf-net.

2 ответов


Я закончил тем, что разветвил проект ProtoGen от protobuf-используется CSharp обнародовать некоторые внутренние типы (генераторы, по большей части) и принять SourceGenerators расширяемый, позволяя пользовательские регистрации генератора.

таким образом, я смог использовать объектную модель дескриптора proto для написания моего собственного генератора c#.

один сложный момент заключается в регистрации пользовательских типов параметров перед запуском синтаксического анализа:

  1. генерация типов C# в соответствии с вашими пользовательскими параметрами (используя Protoc.exe затем ProtoGen.exe)
  2. настроить ExtensionRegistry С помощью сгенерированного RegisterAllExtensions методы.
  3. запустите генерацию кода с помощью собственных генераторов C#. В каждом генераторе вы можете получить доступ к контекстному Descriptor.Options коллекция.

на данный момент нет простого способа сделать это. Необходимые изменения должны быть в первую очередь для используется CSharp.XSLT-файл. Есть ошибка об этом сообщает об этом, но еще не починили.