Nullable类型可以通过Protocol Buffers发送吗?

时间:2017-04-25 15:56:25

标签: c# protocol-buffers

Proto3 C# Reference包含以下文字:

  

包装类型字段

     

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

     

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

     

StringWrapperBytesWrapper类型的字段会产生C#属性   已生成stringByteString类型,但具有默认值   值null,并允许null设置为属性值。

     

对于所有包装器类型,重复时不允许使用空值   字段,但允许作为地图条目的值。

尝试从.cs文件生成.proto文件时,如果我尝试在Int32Wrapper文件中将字段声明为.proto,则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; 
}

这里似乎缺少一些额外的步骤,是否有人知道如何启用这些类型?

2 个答案:

答案 0 :(得分:1)

您需要导入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.Int32Wrapper nullableInt = 5; 
}

然后你可以将它用作int吗? ,例如nullableInt.HasValue和nullableInt.Value

答案 1 :(得分:1)

我将努力改善Nick的答案,因为它没有帮助我。 grpc编译器声称他没有有关google.protobuf.Int32Wrapper类型的信息。我在Microsoft文档中发现它被称为function getDaysArray(year, month) { var numDaysInMonth, daysInWeek, daysIndex, index, i, l, daysArray; numDaysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; daysInWeek = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']; daysIndex = { 'Sun': 0, 'Mon': 1, 'Tue': 2, 'Wed': 3, 'Thu': 4, 'Fri': 5, 'Sat': 6 }; index = daysIndex[(new Date(year, month - 1, 1)).toString().split(' ')[0]]; daysArray = []; for (i = 0, l = numDaysInMonth[month - 1]; i < l; i++) { var d=new Date(year+"-"+month+"-"+(i + 1)) if(!(d.getDay()==0 || d.getDay()==6)){ console.log(d) daysArray.push({ "title":"Turn", "resourceid":"4", "start":year+"-"+month+"-"+(i + 1)+"+"+"08:00:00", "end":year+"-"+month+"-"+(i + 1)+"+"+"14:00:00", "internals": ground[i] // people from array to assign at specific date }); } if (index == 7) index = 0; } return daysArray; } console.log(getDaysArray(2019, 12)); (prooflink https://docs.microsoft.com/en-us/dotnet/architecture/grpc-for-wcf-developers/protobuf-data-types#nullable-types),尽管Google确实将其称为google.protobuf.Int32Value。 因此,对我有帮助的代码如下:

Int32Wrapper