如何使用protobuf-net支持自定义选项?

时间:2011-12-07 19:41:28

标签: code-generation protocol-buffers protobuf-net

我使用protobuf-netProtoGen.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 custom options修改原型代码并修改ProtoGet的{​​{3}}以生成必要的“[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 个答案:

答案 0 :(得分:1)

重新标志;原始protobuf规范并不真正支持复合枚举值,因此在某些方面我理解为什么他们这样做。遗憾的是,没有partial enum这样的内容,因此您无法将[Flags]添加到单独的代码文件中。

重新定制选项;这是一个很好的问题,之前已经提出了对自定义选项的支持。这绝对是我想添加的东西,但 相对于其他功能 它根本不是一个大规模需求的项目,所以(由于资源有限)它没有(尚未完全)进行了调查。

因此,我没有一个很好的答案;这个功能现在还不是很多。您可以在xslt(针对您的特定类型)中对该场景进行硬编码。或者等到我解决它(我没有特定的时间表)。或亲自看看。