[英]Can Nullable types be sent through Protocol Buffers?
Proto3 C# 参考包含以下文本:
包装类型字段
proto3 中大多数众所周知的类型不会影响代码生成,但是包装器类型(StringWrapper、Int32Wrapper 等)会更改属性的类型和行为。
与 C# 值类型(
Int32Wrapper
、DoubleWrapper
、BoolWrapper
等)对应的所有包装器类型都映射到Nullable<T>
,其中T
是相应的不可为空类型。 例如,类型为DoubleValue
的字段会生成类型为Nullable<double>
的 C# 属性。
StringWrapper
或BytesWrapper
类型的字段导致生成string
和ByteString
类型的 C# 属性,但默认值为null
,并允许将null
设置为属性值。对于所有包装器类型,重复字段中不允许使用空值,但允许作为映射条目的值。
尝试从.proto
文件生成.cs
文件时,如果我尝试在.proto
文件中将字段声明为Int32Wrapper
,protoc.exe 会抛出有关Int32Wrapper
不存在的错误。
syntax ="proto3";
package prototest;
import "MessageIdentifier.proto";
message TestMessage {
string messageTest = 1;
fixed64 messageTimestampTicks = 2;
uint32 sequenceNumber = 3;
MessageUniqueID uniqueID = 4;
Int32Wrapper nullableInt = 5;
}
似乎这里缺少一些额外的步骤,有人知道如何启用这些类型吗?
我会尝试改进尼克的答案,因为它对我没有帮助。 grpc 编译器声称他没有关于google.protobuf.Int32Wrapper
类型的信息。 我发现它实际上被称为google.protobuf.Int32Value
( https://github.com/protocolbuffers/protobuf/blob/48234f5f012582843bb476ee3afef36cda94cb66/src/google/protobuf/wrappers.proto#L88 ),虽然Int32Wrapper
所以帮助我的代码如下:
...
import "google/protobuf/wrappers.proto";
...
message TestMessage {
...
google.protobuf.Int32Value nullableInt = 5;
}
其他链接:
关于https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/wrappers.proto
您需要导入 google/protobuf/wrappers.proto 才能使其正常工作。
syntax ="proto3";
package prototest;
import "MessageIdentifier.proto";
import "google/protobuf/wrappers.proto";
message TestMessage {
string messageTest = 1;
fixed64 messageTimestampTicks = 2;
uint32 sequenceNumber = 3;
MessageUniqueID uniqueID = 4;
google.protobuf.Int32Value nullableInt = 5;
}
然后您可以将其用作int? ,例如 nullableInt.HasValue 和 nullableInt.Value
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.