Создание C# из файлов proto и наоборот интерпретация пользовательских параметров
я использую protobuf-чистая, и я пытаюсь:
- создайте класс C# из a .proto file
- создать .файл proto из класса C#
это довольно легко использовать соответственно:
-
protogen.exe
инструмент -
Serializer<T>.GetProto()
метод
но дело в том, что мне нужно поддержать protobuffer пользовательские параметры и это, похоже, не так прямолинейно,как и я.
поясню:
- из файла proto, содержащего пользовательские параметры, применяемые к сообщениям и полям, я хочу создать класс C#, украшенный пользовательскими атрибутами .NET.
- из класса 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#.
один сложный момент заключается в регистрации пользовательских типов параметров перед запуском синтаксического анализа:
- генерация типов C# в соответствии с вашими пользовательскими параметрами (используя
Protoc.exe
затемProtoGen.exe
) - настроить
ExtensionRegistry
С помощью сгенерированногоRegisterAllExtensions
методы. - запустите генерацию кода с помощью собственных генераторов C#. В каждом генераторе вы можете получить доступ к контекстному
Descriptor.Options
коллекция.
на данный момент нет простого способа сделать это. Необходимые изменения должны быть в первую очередь для используется CSharp.XSLT-файл. Есть ошибка об этом сообщает об этом, но еще не починили.