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?。但它在运行时失败,带有一个不允许的空参数异常。我可以理解repeated不允许空消息。但是Int32Value是 WellKnownType,因此编译器可以在需要时生成特殊的 NullValue 类型。

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

除了创建自己的消息和 codegen 之外,在 protobuf 协议中执行可为空的 int 数组的选项有哪些?

4

1 回答 1

3

这是 protobuf 的限制吗

是的。重复的Int32Value工作就像其他重复的消息一样:没有办法表示空值。请注意,在网络上,对 没有特殊处理Int32Value,并且许多语言根本没有对其进行任何特殊处理。是的,这意味着一个repeated Int32Value领域是毫无意义的。这是一个笼统的陈述,而不是任何特定于 C# 的陈述。

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

message Int32ValueWrapper
{
    Int32Value value = 1;
}

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

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

于 2018-06-09T15:25:26.587 回答