C# 如何在gRPC中声明与C相同的十进制对象#

C# 如何在gRPC中声明与C相同的十进制对象#,c#,protocol-buffers,grpc,C#,Protocol Buffers,Grpc,我们正在将现有的RESTAPI服务转换为gRPC核心。在迁移现有类时,gRPC不具有十进制数据类型。我们在C#中有一个类,定义为 public class SalarySchedule { public decimal Salary { get; set; } public DateTime? SalaryDate { get; set; } } 我们在proto文件中实现了 message SalarySchedule { // TODO: How to define

我们正在将现有的RESTAPI服务转换为gRPC核心。在迁移现有类时,gRPC不具有十进制数据类型。我们在C#中有一个类,定义为

public class SalarySchedule
{
    public decimal Salary { get; set; }
    public DateTime? SalaryDate { get; set; }
}
我们在proto文件中实现了

message SalarySchedule
{
    // TODO: How to define this double to decimal
    double Salary = 1;
    google.protobuf.Timestamp SalaryDate =2;
}
目前,我们已经对工资数据类型使用了double。但这在内部计算中造成了问题


请您指导我们,我们如何在gRPC中将其定义为十进制?

有一个提议的货币类型已经讨论过了,但作为“众所周知的”原型,它还没有出现


现在,老实说,我建议只使用
string
。我不知道您使用的是Google实现还是protobuf-net.Grpc(它内置在其中,但允许“代码优先”使用),但如果您使用后者(protobuf-net.Grpc)和protobuf-net V3,您可以使用来指定级别300或更高,它将把
十进制
当作
字符串
进行序列化处理。如果您使用的是Google的.proto方法,我会手动应用转换,确保使用不变的区域性。

不要对金融类使用double,但听起来您已经知道了。谢谢您的解释。我正在使用Google的.proto方法。如果我使用字符串类型并手动转换它,如果我最终计算庞大的集合,会不会对性能造成开销?@Oxygen您在Google实现中的任何类型都会遇到这个问题,因为所有
消息
类型都会变成
,除非显式处理-这不是问题;直接支持
double
类型,但是:对于货币单位来说是一个糟糕的选择values@Oxygen注意:protobuf net在不进行分配的情况下处理这个问题(它在内部处理类型),但是:这是一个非常重要的代码更改