gpt4 book ai didi

C# Protobuf 网络 : Dictionary of decimals: Zeroes don't get roundtrip properly

转载 作者:太空狗 更新时间:2023-10-30 01:13:13 26 4
gpt4 key购买 nike

我在 protobuf-net 中发现了一个关于十进制零的序列化/反序列化的奇怪错误,想知道是否有人为此找到了一个好的解决方法,或者这是否真的是一个功能。

给定一个像上面这样的字典,如果我在 linqpad 中运行:

void Main()
{
{
Dictionary<string, decimal> dict = new Dictionary<string, decimal>();
dict.Add("one", 0.0000000m);
DumpStreamed(dict);
}

{
Dictionary<string, decimal> dict = new Dictionary<string, decimal>();
dict.Add("one", 0m);
DumpStreamed(dict);
}
}

public static void DumpStreamed<T>(T val)
{
using (var stream = new MemoryStream())
{
Console.Write("Stream1: ");
ProtoBuf.Serializer.Serialize(stream, val);
foreach (var by in stream.ToArray())
{
Console.Write(by);
}

Console.WriteLine();
Console.Write("Stream2: ");
stream.Position = 0;
var item = ProtoBuf.Serializer.Deserialize<T>(stream);
using(var stream2 = new MemoryStream())
{
ProtoBuf.Serializer.Serialize(stream2, item);
foreach (var by in stream2.ToArray())
{
Console.Write(by);
}

}
}

Console.WriteLine();
Console.WriteLine("----");
}

我会得到两个不同的流:

第一次序列化:1091031111101011822414

第二次序列化:107103111110101180

(0.0000000m 在反序列化时被转换为 0)。

我发现这是由于 ReadDecimal 中的这行代码造成的:

 if (low == 0 && high == 0) return decimal.Zero;

有谁知道为什么零仅在反序列化期间而不是在序列化期间被标准化?

或者在序列化/反序列化字典中始终规范化或始终不规范化十进制零的任何解决方法?

最佳答案

是的;问题在于这条善意但可能有害的线路:

    if (low == 0 && high == 0) return decimal.Zero;

它忽略了检查 signScale。它真的应该是:

    if (low == 0 && high == 0 && signScale == 0) return decimal.Zero;

我会在下一个版本中对其进行调整。

(编辑:我最终完全删除了该检查 - 其余代码只是一些整数移位等,因此拥有“分支”可能比拥有它更昂贵)

关于C# Protobuf 网络 : Dictionary of decimals: Zeroes don't get roundtrip properly,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50807668/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com