官方文档:https://learn.microsoft.com/zh-cn/dotnet/architecture/grpc-for-wcf-developers/protobuf-data-types
Proto文件目前所支持的数据类型有:
在官方文档中有提到,除以上数据类型外,还可以引用协议来指定“已知类型”扩展。比如:
-
日期和时间
c#类型DateTimeOffset、DateTime对应google.protobuf.Timestamp;TimeSpan类型对应google.protobuf.Duration
引用:
import "google/protobuf/duration.proto" ;
import "google/protobuf/timestamp.proto";
使用:message Meeting { string subject = 1; google.protobuf.Timestamp time = 2; google.protobuf.Duration duration = 3; }
-
Guid
Protobuf 不直接支持 Guid 类型,(在其他平台上称为 UUID 类型)。 它没有适用的已知类型。最佳方法是使用标准 8-4-4-4-12 十六进制格式(例如,45a9fda3-bd01-47a9-8460-c1cd7484b0b3)将 Guid 值作为 string 字段处理。 所有语言和平台都可以分析该格式。
不要为 Guid 值使用 bytes 字段。 当 Protobuf 与其他平台(如 Java)交互时,字节序(维基百科的定义)的问题会导致行为不稳定。 -
可为 null 的类型
引用:import "google/protobuf/wrappers.proto";
使用:message Person { google.protobuf.StringValue str= “Holle World”; google.protobuf.Int32Value age = 5; ... }
-
Decimal
Proto文件时不支持decimal类型的,官方文档中有写如何创建自定义decimal类型
以下演示自定义DecimalValue类型,将DecimalValue放入单独的proto文件供其他proto文件引用1、新建一个proto文件(我这里建立的文件名为:customTypes.proto)
(命名不能与要定义的类型同名,包括大小写。例如我要自定义DecimalValue类型,我的proto文件不能取名为decimalvalue或者Decimalvalue,因为proto文件生成上下类cs文件的时候,会自动将package命名的首字母大写,如果命名与要定义的类型同名,则里面的类型名定义会被自动加后缀,后期建立公共方法的时候就找不到了)
2、写好proto文件,添加服务引用后重新生成(如何添加服务引用上一篇<WPC调用Grpc>笔记中有写=>双击项目,写入Protobuf Include=“Protos\customTypes.proto” 和None Remove=“Protos\customTypes.proto” ),重新生成Grpc项目
3、在项目下新增一个cs公共方法,使自定义参数与decimal 类型之间进行转换
(放在最外层,直接右键项目新增cs文件)
将官方文档中的代码放进去,就可以了。需要注意:namespace CustomTypes; 命名空间是你的proto文件生成的cs文件名(例如:我的proto文件package是customTypes,步骤2里重新生成的时候自动生成的cs文件名是CustomTypes,所以我的公共方法引用的命名空间就是namespace CustomTypes;)
4、使用自定义类型
在需要用decimal类型的proto文件中,引用协议(和官方提供的引用方法一样)
引用:
import "Protos/customTypes.proto";
我的customTypes.proto文件直接放在Proto文件夹下,如果你的存在别的文件夹,就写全就可以了,起始文件夹名称为项目下的一级目录
使用:(用proto文件名.自定义类型命)
message CustomerRebateInfo{
string str=1;
customTypes.DecimalValue total1=2;
customTypes.DecimalValue jinE1=3;
}
---------End结束-----------
另外:客户端也一样,要把新增的proto文件和生成的cs文件放到客户端项目中。包括公共方法也要放过去,最好存放位置和服务端一致,避免出现意外。
这样就可以直接把customTypes.Decimal当作c#中的decimal使用了,无需再转换,在客户端使用也一样,可以把customTypes.Decimal就看做是decimal。