protobuf3中重复的Int32Value(可空的int数组)

时间:2018-06-09 15:03:35

标签: c# protocol-buffers protobuf-csharp-port protobuf-3

我有以下protobuf消息协议:

message TestMsg
{
  int32 int = 1;
  google.protobuf.Int32Value nullable_int = 2;
  repeated google.protobuf.Int32Value nullable_int_array = 3; // Runtime fail
}

protoc编译得很好,在C#中所有Int32Values都是int?。但它在运行时失败,带有null参数,不允许异常。我能理解repeated不允许空消息。但Int32Value是一个WellKnownType,因此编译器可以根据需要生成一个特殊的NullValue类型。

这是protobuf中的限制(Int32Value中不允许repeated)还是C#代码生成和支持库中的限制/错误?

在protobuf协议中可以使用nullable int数组的选项有哪些,除了创建自己的消息和codegen?

1 个答案:

答案 0 :(得分:1)

  

这是protobuf的限制

是。重复的Int32Value就像其他重复的消息一样工作:没有办法表示null。请注意,在线上,Int32Value没有特殊处理,并且许多语言根本没有任何特殊处理。是的,这意味着repeated Int32Value字段毫无意义。这是一个通用语句,而不是C#特定的任何语句。

如果您希望能够使用某些空条目表示重复字段,则需要创建包装包装器的消息:

message Int32ValueWrapper
{
    Int32Value value = 1;
}

...然后有一个repeated Int32ValueWrapper字段。这将填充Int32ValueWrapper个元素,所有元素都是非空的,但其中一些元素可能为空(因此value字段未填充)。

对于C#代码生成来说这是一个棘手的情况,就它应该做什么来说......基本上它有点阻抗不匹配。