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

mal*_*loo 5 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
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Jon*_*eet 6

这是 protobuf 的限制吗

是的。重复的Int32Value工作方式就像其他重复消息一样:无法表示空值。请注意,在线上,没有对 进行特殊处理Int32Value,并且许多语言根本没有对其进行任何特殊处理。是的,这意味着repeated Int32Value字段毫无意义。这是一般性的陈述,而不是任何特定于 C# 的内容。

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

message Int32ValueWrapper
{
    Int32Value value = 1;
}
Run Code Online (Sandbox Code Playgroud)

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

对于 C# 代码生成来说,就其应该执行的操作而言,这是一个棘手的情况……基本上,这有点阻抗不匹配。