• Grpc自定义类型(含Decimal)


    官方文档: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;
       		}
      
      • 1
      • 2
      • 3
      • 4
      • 5
    • 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;
          ...
          }
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
    • Decimal
      Proto文件时不支持decimal类型的,官方文档中有写如何创建自定义decimal类型
      以下演示自定义DecimalValue类型,将DecimalValue放入单独的proto文件供其他proto文件引用

      1、新建一个proto文件(我这里建立的文件名为:customTypes.proto)
      (命名不能与要定义的类型同名,包括大小写。例如我要自定义DecimalValue类型,我的proto文件不能取名为decimalvalue或者Decimalvalue,因为proto文件生成上下类cs文件的时候,会自动将package命名的首字母大写,如果命名与要定义的类型同名,则里面的类型名定义会被自动加后缀,后期建立公共方法的时候就找不到了)
      在这里插入图片描述
      在这里插入图片描述

      2、写好proto文件,添加服务引用后重新生成(如何添加服务引用上一篇笔记中有写=>双击项目,写入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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    ---------End结束-----------

    另外:客户端也一样,要把新增的proto文件和生成的cs文件放到客户端项目中。包括公共方法也要放过去,最好存放位置和服务端一致,避免出现意外。
    这样就可以直接把customTypes.Decimal当作c#中的decimal使用了,无需再转换,在客户端使用也一样,可以把customTypes.Decimal就看做是decimal。

  • 相关阅读:
    [附源码]Python计算机毕业设计Django体育器材及场地管理系统
    [iOS]App Store Connect添加银行卡时的CNAPS代码查询
    【U-Boot笔记整理】U-Boot 完全分析与移植
    css 图片好玩的一个属性,添加滤镜
    6.2 事件的创建,修改和删除
    语音增强用到的方法总结
    FGO:使用chaIdea获取抽卡数据(mitmproxy抓包)
    String 类的基本用法及String 类的常见操作
    多任务联合训练,出现Nan的问题
    【XInput】游戏手柄模拟鼠标动作
  • 原文地址:https://blog.csdn.net/qq_51462774/article/details/132729902