Несколько проще реализовать подход, чем у Джона или Марка, - сохранить его как значения 4 sint32
, что удобно тривиально сопоставить с выводом Decimal.GetBits () .
Файл прото будет выглядеть так:
message ProtoDecimal {
sint32 v1 = 1;
sint32 v2 = 2;
sint32 v3 = 3;
sint32 v4 = 4;
}
И конвертер будет:
public decimal ConvertToDecimal(AbideDecimal value)
{
return new decimal(new int[] { value.V1, value.V2, value.V3, value.V4 });
}
public ProtoDecimal ConvertFromDecimal(decimal value)
{
var bits = decimal.GetBits(value);
return new ProtoDecimal
{
V1 = bits[0],
V2 = bits[1],
V3 = bits[2],
V4 = bits[3]
}
}
Это может быть не так просто в других языках, но если вам нужно только нацелиться на C #, тогда он займет столько же максимум 16 байт, как и другой подход (хотя значения типа 0 могут быть не так компактно сохранены - я Я не знаю достаточно о сложных деталях того, как Protobuf хранит целые), и в то же время гораздо понятнее глупым программистам, таким как я :)
Очевидно, что вам придется мчаться на лошадях , если вы хотите проверить работоспособность, но я сомневаюсь, что в этом много.