Я обнаружил странную ошибку, связанную с сериализацией / десериализацией десятичных нулей в 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;
Кто-нибудь знает, почему нулинормализуется только во время десериализации, а не при сериализации?
Или какой-нибудь обходной путь для последовательной нормализации или последовательного ненормирования десятичного нуля в словаре по сериализации / десериализации?