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

C# 可以通过协议缓冲区发送空类型吗?,c#,protocol-buffers,C#,Protocol Buffers,包含以下文本: 包装类型字段 proto3中的大多数已知类型不影响代码生成, 但是包装器类型(StringWrapper、Int32Wrapper等)改变了 属性的类型和行为 与C#值类型对应的所有包装类型 (Int32Wrapper、DoubleWrapper、BoolWrapper等)被映射到 Nullable其中T是相应的不可为空类型。对于 例如,类型为DoubleValue的字段会产生类型为的C#属性 Nullable 类型为StringWrapper或byteswapper的字段将生成

包含以下文本:

包装类型字段

proto3中的大多数已知类型不影响代码生成, 但是包装器类型(StringWrapper、Int32Wrapper等)改变了 属性的类型和行为

与C#值类型对应的所有包装类型 (
Int32Wrapper
DoubleWrapper
BoolWrapper
等)被映射到
Nullable
其中
T
是相应的不可为空类型。对于 例如,类型为
DoubleValue
的字段会产生类型为的C#属性
Nullable

类型为
StringWrapper
byteswapper
的字段将生成C#属性 正在生成类型为
string
ByteString
,但具有默认值
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; 
}
这里似乎缺少了一些额外的步骤,有人知道如何启用这些类型吗?

您需要导入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

我将尝试改进Nick的答案,因为这对我没有帮助。 grpc编译器声称他没有关于
google.protobuf.Int32Wrapper
类型的信息。我发现它实际上被称为
google.protobuf.Int32Value
(),尽管谷歌实际上称它为
Int32Wrapper
。 因此,帮助我的代码如下:

。。。
导入“google/protobuf/wrappers.proto”;
...
消息测试消息{
...
google.protobuf.Int32Value nullableInt=5;
}
其他链接:

  • C#lib源代码-
  • C#文件-

声明字段是不明确的,您是定义一个proto文件并生成C#class,还是在C#class中定义一个字段并试图生成一个proto?一个简单的例子可能有助于澄清。@Guvante我正在尝试使用protoc.exe从.proto文件生成.cs文件。我已经编辑了我的问题,添加了更多细节和一个示例.proto文件。奇怪的是,在该页面之外,我找不到任何关于Int32Wrapper的通用文档,也找不到protobuf:@Guvante的测试用例,这真的很奇怪。我想我一定是遗漏了什么,但也许这只是一个糟糕的文档。这应该是公认的答案。这是它的官方文档-。