【发布时间】:2018-06-12 00:16:09
【问题描述】:
我在 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;
有谁知道为什么零只在反序列化过程中被标准化,而不是在序列化过程中?
或者在序列化/反序列化的字典中始终规范化或始终不规范化十进制零的任何解决方法?
【问题讨论】:
-
添加了完整的代码块,对此感到抱歉。重要性不在于保留零,而在于生成的字节流的差异。产生的字节流不同,导致字典周围的误报也不同。
-
(交叉引用“长尾”的github问题:github.com/mgravell/protobuf-net/issues/402)
标签: c# decimal protobuf-net