繁体   English   中英

可以通过协议缓冲区发送可空类型吗?

[英]Can Nullable types be sent through Protocol Buffers?

Proto3 C# 参考包含以下文本:

包装类型字段

proto3 中大多数众所周知的类型不会影响代码生成,但是包装器类型(StringWrapper、Int32Wrapper 等)会更改属性的类型和行为。

与 C# 值类型( Int32WrapperDoubleWrapperBoolWrapper等)对应的所有包装器类型都映射到Nullable<T> ,其中T是相应的不可为空类型。 例如,类型为DoubleValue的字段会生成类型为Nullable<double>的 C# 属性。

StringWrapperBytesWrapper类型的字段导致生成stringByteString类型的 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM