Grpc自定义类型(含Decimal)

官方文档:https://learn.microsoft.com/zh-cn/dotnet/architecture/grpc-for-wcf-developers/protobuf-data-types

Proto文件目前所支持的数据类型有:
Grpc自定义类型(含Decimal)_第1张图片

在官方文档中有提到,除以上数据类型外,还可以引用协议来指定“已知类型”扩展。比如:

  • 日期和时间
    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命名的首字母大写,如果命名与要定义的类型同名,则里面的类型名定义会被自动加后缀,后期建立公共方法的时候就找不到了)
    Grpc自定义类型(含Decimal)_第2张图片
    Grpc自定义类型(含Decimal)_第3张图片

    2、写好proto文件,添加服务引用后重新生成(如何添加服务引用上一篇笔记中有写=>双击项目,写入Protobuf Include=“Protos\customTypes.proto” 和None Remove=“Protos\customTypes.proto” ),重新生成Grpc项目
    Grpc自定义类型(含Decimal)_第4张图片

    3、在项目下新增一个cs公共方法,使自定义参数与decimal 类型之间进行转换
    (放在最外层,直接右键项目新增cs文件)
    将官方文档中的代码放进去,就可以了。需要注意:namespace CustomTypes; 命名空间是你的proto文件生成的cs文件名(例如:我的proto文件package是customTypes,步骤2里重新生成的时候自动生成的cs文件名是CustomTypes,所以我的公共方法引用的命名空间就是namespace CustomTypes;)
    Grpc自定义类型(含Decimal)_第5张图片
    Grpc自定义类型(含Decimal)_第6张图片

    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。

你可能感兴趣的:(gRPC,笔记,Asp.net,Core,c#)