协议缓冲区和枚举组合?

罗伊·纳米尔(Roi Namir)

这是我的原始文件:

message MSG {

  required MsgCodes MsgCode = 1;
  optional int64 Serial = 2;        // Unique ID number for this person.
  required int32 From = 3;  
  required int32 To = 4;  
  //bla bla...
        enum MsgCodes
        {
            MSG = 1;
            FILE = 2;
            APPROVE=4;
            ACK=8;
            ERROR_SENDING=16;
            WORLD=32;
        }
}

在我的C#中,我试图:

 msg = msg.ToBuilder().SetMsgCode(msg.MsgCode | MSG.Types.MsgCodes.ACK | MSG.Types.MsgCodes.APPROVE).Build();
 SendToJava(msg);

但是JAVA告诉我:缺少MsgCode(这是一个required

删除组合-确实可以解决

但我需要指定组合

问题

我该如何解决?

nb:

奇怪的是,如果我创建一个msg并且设置了多个枚举,然后再次在C#中读取它,则它确实可以工作... :-(

肯顿·瓦尔达(Kenton Varda)

在Protobufs中,只允许枚举类型的字段具有枚举中指定的确切数值之一。也就是说,您不能将枚举类型的字段用作位字段。如果要使用位域,则需要使用整数类型,例如int32该规则实际上甚至适用于具有数字枚举类型的语言,例如C ++ -如果从电线读取的枚举类型的protobuf字段具有无效值,它将被视为未知字段并因此被隐藏。

如果切换到整数,那么您现在当然会遇到如何声明标志值的问题。不幸的是,Protobufs没有提供定义常量的好方法。正如您在自我解答中所建议的那样,您可以将虚拟枚举定义用作hack,但是请注意,该数值不一定在所有语言中都可用。它可以在C ++和Python中使用,因为它们使用数字枚举(显然也使用C#吗?)。在Java中,Protobuf枚举具有一种.getNumber()可用于获取数字值的方法。否则,普通的Java枚举不是数字。

(此外:我是Google大部分Protobuf开源代码的作者。我还是Cap'n Proto的作者,Cap'n Proto是一个旨在取代Protobufs的新型非Google项目。除其他优点外,Cap'n Proto还支持定义模式文件中的常量。但是,截至本文撰写时,C#支持尚未准备好(尽管正在开发中!)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

协议缓冲区:如何为枚举创建.proto文件?

来自分类Dev

微软的Bond和Google的协议缓冲区之间的区别

来自分类Dev

研究奇怪的协议缓冲区消息(解码和编码)

来自分类Dev

avro是否支持枚举值的数字常量,类似于协议缓冲区枚举?

来自分类Dev

开始:安全地将整数转换为协议缓冲区枚举值的最佳实践

来自分类Dev

带反射的嵌套协议缓冲区

来自分类Dev

Java协议缓冲区-反射

来自分类Dev

在C ++中解析协议缓冲区

来自分类Dev

Scala Akka和协议缓冲区

来自分类Dev

带有协议缓冲区的RPC

来自分类Dev

协议缓冲区Wireshark插件

来自分类Dev

改善协议缓冲区的性能

来自分类Dev

协议缓冲区消息的字节序

来自分类Dev

协议缓冲区:版本更改

来自分类Dev

REST是否支持协议缓冲区

来自分类Dev

损坏的协议缓冲区消息

来自分类Dev

协议缓冲区-分配嵌套消息

来自分类Dev

Ionic 4协议缓冲区

来自分类Dev

协议缓冲区损坏数据

来自分类Dev

在协议缓冲区中分隔消息

来自分类Dev

Java协议缓冲区-消息大小

来自分类Dev

带反射的嵌套协议缓冲区

来自分类Dev

谷歌协议缓冲区漂亮的打印

来自分类Dev

带有CMakeLists的协议缓冲区

来自分类Dev

协议缓冲区与 codelite 的静态链接

来自分类Dev

如何在Django视图中捕获和修改Google协议缓冲区?

来自分类Dev

使用ScalaPB中的协议缓冲区生成Java和Scala类

来自分类Dev

协议缓冲区和Avro中的ZigZag编码背后的原因是什么?

来自分类Dev

协议缓冲区-如何实现可扩展性和向后兼容?