【问题标题】:How to support custom options with protobuf-net?如何使用 protobuf-net 支持自定义选项?
【发布时间】:2011-12-08 04:55:04
【问题描述】:

我使用 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 来修改原始代码并修改ProtoGetXSLT transform 以生成必要的`[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;
}   

问题是所有自定义选项在ProtoGen 的临时文件中显示为uninterpreted_option

知道我可以做些什么来在我的代码中获得[Flags] 注释吗?

【问题讨论】:

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


    【解决方案1】:

    重新标志;原始 protobuf 规范并不真正支持复合枚举值,所以在某些方面我理解他们为什么这样做。遗憾的是没有partial enum 这样的东西,所以你不能在单独的代码文件中添加[Flags]

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

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

    【讨论】:

    • 这个有更新吗? @MarcGravell 在使用 protogen 生成 C# 文件时是否可以有自定义选项?
    • @nj_bubbles 我们目前不在生成类型中保留自定义选项数据。理论上我们可以。您对如何查询这些数据有什么建议吗?它以某种方式被持久化了?
    • 我不确定持久性。但例如,如果我从具有上述问题中的“扩展”的原始文件生成 C# 等效项,则会收到“未找到 Google”命名空间错误。如果我要使用 Google Protobuf 包,那么这将起作用,但我想知道如何使用 protobuf-net 来实现这一点。
    • @nj_bubbles 这听起来像是一个完全不同的问题 - 听起来你只是缺少一个“导入”,特别是 import "google/protobuf/descriptor.proto"; - extend 工作得很好,并且数据在期间完全可用原生质处理
    • 我的错。谢谢你的提示。我在 proto 文件中添加了此导入,但生成的 C# 等效项仍然存在未找到命名空间错误。我还应该在 C# 端添加一些特定的包吗?我使用 protogen 生成 C# 文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多