Генерация C # из прототипов и наоборот интерпретация пользовательских опций - PullRequest
9 голосов
/ 28 марта 2011

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

  1. Создание класса C # из файла .proto
  2. Создание файла .proto из класса C #

Это довольно легко, используя соответственно:

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

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

Позвольте мне объяснить:

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

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

Ответы [ 2 ]

2 голосов
/ 31 марта 2011

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

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

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

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

На данный момент не существует простого способа сделать это. Требуемые изменения будут в основном вноситься в файл csharp.xslt. Об этой ошибке сообщили , но она еще не исправлена.

...