我有以下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?
答案 0 :(得分:1)
这是protobuf的限制
是。重复的Int32Value
就像其他重复的消息一样工作:没有办法表示null。请注意,在线上,Int32Value
没有特殊处理,并且许多语言根本没有任何特殊处理。是的,这意味着repeated Int32Value
字段毫无意义。这是一个通用语句,而不是C#特定的任何语句。
如果您希望能够使用某些空条目表示重复字段,则需要创建包装包装器的消息:
message Int32ValueWrapper
{
Int32Value value = 1;
}
...然后有一个repeated Int32ValueWrapper
字段。这将填充Int32ValueWrapper
个元素,所有元素都是非空的,但其中一些元素可能为空(因此value
字段未填充)。
对于C#代码生成来说这是一个棘手的情况,就它应该做什么来说......基本上它有点阻抗不匹配。