Как поддерживать пользовательские опции с protobuf-net? - PullRequest
2 голосов
/ 07 декабря 2011

Я использую protobuf-net и ProtoGen.exe для анализа следующего файла .proto (предоставленного другим проектом)

enum RGBFlags { FLAG_RED = 1; FLAG_GREEN = 2; FLAG_BLUE = 4; }

message SomeMessage {
  // Values from RGBFlags only allowed
  optional int32 flags = 2;
}   

Моим коллегам-программистам на C ++ не важен типбезопасность и обрабатывать поле flags как простое целое число.Я хотел быть более строгим и стараться избегать такого кода:

SomeMessage foo = new SomeMessage();
foo.flags = (int)RGBFlags.FLAG_BLUE | (int)RGBFlags.FLAG_GREEN;

Я думал, что мог бы использовать пользовательские опции protbuf , чтобы изменить протокод и модифицировать XSLT-преобразование из ProtoGet для создания необходимых аннотаций `[Flags].

extend google.protobuf.EnumOptions {
  optional bool generate_bit_field = 60000;
}

enum RGBFlags {
  option (generate_bit_field) = true;
  FLAG_RED = 1; FLAG_GREEN = 2; FLAG_BLUE = 4;
}

message SomeMessage {
  // Values from RGBFlags only allowed
  optional int32 flags = 2;
}   

Проблема заключается в том, что все пользовательские параметры отображаются как uninterpreted_option во временном файле в ProtoGen.

Есть идеи, что я могу сделать, чтобы получить [Flags] аннотации в моем коде?

1 Ответ

1 голос
/ 08 декабря 2011

Re флаги;Необработанная спецификация protobuf на самом деле не поддерживает составные значения enum, поэтому в некотором смысле я понимаю, почему они делают это именно так.И, к сожалению, такого как partial enum нет, поэтому вы не можете добавить [Flags] в отдельный файл кода.

Re настраиваемые параметры;это отличный вопрос, и поддержка пользовательских опций уже поднималась.Это определенно то, что я хотел бы добавить, но по сравнению с другими функциями это просто не востребованный предмет, поэтому (из-за ограниченных ресурсов) его нет (пока) полностью расследовано.

Поэтому у меня нет хорошего ответа для вас;эта особенность на самом деле не так уж много сейчас.Вы можете жестко запрограммировать этот сценарий в вашем xslt (для ваших конкретных типов).Или подождите, пока я не доберусь до этого (у меня нет конкретного графика времени).Или взгляните сами.

...