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 数组的选项还有哪些?
这是 protobuf 的限制吗
是的。重复的Int32Value工作方式就像其他重复消息一样:无法表示空值。请注意,在线上,没有对 进行特殊处理Int32Value,并且许多语言根本没有对其进行任何特殊处理。是的,这意味着repeated Int32Value字段毫无意义。这是一般性的陈述,而不是任何特定于 C# 的内容。
如果您希望能够表示具有一些空条目的重复字段,则需要创建一个包装包装器的消息:
message Int32ValueWrapper
{
Int32Value value = 1;
}
Run Code Online (Sandbox Code Playgroud)
...然后有一个repeated Int32ValueWrapper字段。它将填充Int32ValueWrapper所有元素,所有这些元素都为非空,但其中一些可能为空(因此该value字段未填充)。
对于 C# 代码生成来说,就其应该执行的操作而言,这是一个棘手的情况……基本上,这有点阻抗不匹配。
| 归档时间: |
|
| 查看次数: |
3364 次 |
| 最近记录: |