protobuf-net是否支持可空类型?是否可以在protobuf-net中生成可为空的成员?消息ProtoBuf1{可选的Int32?数据位=1;可选的可空数据布尔=2;是的,但如果您从.proto执行代码生成,则默认情况下不会生成它们。如果这只是C#,当然,您不需要.proto-只需:[ProtoContract]publicclassProgoBuf1{[ProtoMember(1)]publicint?Foo{get;set;}[ProtoMember(2)]公共浮动?Bar{get;set;}}如果您使用的是.proto,您可以考虑复制和编辑csharp.xslt以适合您的首选布局。这是我在使用GoogleProtobuf.NETAPI时针对可空类型的解决方案,它需要ProtocolBuffers版本3。(请注意,这不是使用MarcGravell的protobuf-net,因此这不是问题的确切答案。)在NullableInt32.proto中:syntax="proto3";消息NullableInt32{int32值=1;}在NullableInt32Extensions.cs中:publicstaticclassNullableInt32Extensions{publicstaticboolHasValue(thisNullableInt32source){returnsource!=null;}}publicpartialclassNullableInt32{publicstaticimplicitoperatorint?(NullableInt32其他){返回其他==null?(int?)null:other.Value;}publicstaticimplicitoperatorNullableInt32(int?other){returnother==null?null:newNullableInt32{Value=other.Value};此模式可用于任何Protobuf非长度分隔标量值——double、float、int32、int64、uint32、uint64、sint32、sint64、fixed32、fixed64、sfixed32、sfixed64和bool。这就是它的工作原理。假设您有一条带有NullableInt32字段的Record消息,并且它是此设计示例中的唯一字段。在Record.proto中:syntax="proto3";导入“NullableInt32.proto”;消息记录{NullableInt32id=1;使用Google的protoc.exe将其编译为C#后,您可以看到Id属性几乎与Nullable完全相同。varr=新记录();//r.Id默认为null,但我们仍然可以调用HasValue()//因为扩展方法适用于null引用。r.Id.HasValue();//=>false//我们可以显式地将Id设置为null。r.Id=null;//得益于我们的隐式转换运算符,我们可以直接将Id设置为原始数值。r.Id=1;//我们还可以在任何需要//Nullable的上下文中使用NullableInt32。以下方法的签名是//boolEquals(int?,int?)。Nullable.Equals(r.Id,1);//=>true//我们可以显式地将Id设置为NullableInt32。r.Id=newNullableInt32{Value=1};//就像Nullable一样,我们可以直接获取或设置一个//NullableInt32的值,但前提是它不为空。否则,//我们将得到NullReferenceException。使用HasValue()来避免这种情况。如果(r.Id.HasValue())r.Id.Value.ToString();//=>"1"//将Id设置为0与将Id设置为新的//NullableInt32相同,因为int32的默认值为0。//The以下表达式是等价的。r.Id=0;r.Id=newNullableInt32();r.Id=newNullableInt32{Value=0};r.Id.Value=0;//只要Id最终不为空,让我们看看我们的Record消息将如何通过线路传输,具有不同的Id值以上是C#学习教程:Doesprotobuf-netsupportnullabletypes?分享的所有内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注——varr=newRecord();//当Id为null时,Record为空,因为它没有其他字段。//显式将Id设置为null与//根本不设置它具有相同的效果。r.Id=null;r.ToByteArray();//=>byte[0]//由于NullableInt32是Protobuf消息,它被编码为//长度分隔类型。将Id设置为1将产生四个字节。//前两个表示NullableInt32//消息的类型和长度,后两个表示其中包含的类型和值。r.Id=1;r.ToByteArray();//=>byte[]{//0x0a,//field=1,type=2(lengthdelimited)//0x02,//length=2//0x08,//field=1,type=0(varint)//0x01,//value=1//}//当Id设置为默认的int32值0时,只需要两个字节//因为默认值不会通过线路发送。//这两个字节只是表示存在一个空的NullableInt32。r.Id=0;r.ToByteArray();//=>byte[]{//0x0a,//field=1,type=2(lengthdelimited)//0x00,//length=0//}本文来自网络合集,不代表立场,如涉及侵权请点击维权联系管理员删除如需转载请注明出处:
