无法将十进制小数添加到模型

时间:2017-12-28 14:58:16

标签: c# protobuf-net

我们最近将protobuf-net从2.0.0.668升级到2.3.2用于我们的一个项目,现在我们在序列化其中一个对象时遇到了问题。

序列化Dictionary<long, decimal?>类型的属性时,protobuf-net  抛出:

  

ProtoBuf.ProtoException:&#39;此类型的数据具有内置行为,无法以这种方式添加到模型中:System.Nullable`1 [[System.Decimal,mscorlib,Version = 4.0.0.0,Culture =中立,PublicKeyToken = b77a5c561934e089]]

我在网上看到,这与这是一种在protobuf-net中有默认序列化程序的事实有关。但是,这在版本2.0.0.668中有效,而另一个十进制属性不会导致任何问题。在我的案例中如何解决这个问题?

[ProtoContract]
public class MyObject
{
    [ProtoMember(1)]
    public MyType TypeInstance { get; set; }

    [ProtoMember(2)]
    public Dictionary<long, decimal?> MyDictionary { get; set; }

    [ProtoMember(3)]
    public decimal Total { get; set; }
}
public class OtherClass
{
    public static byte[] ToProto<T>(T input)
    {
        byte[] bytResults;
        using (var stream = new MemoryStream())
        {
            Serializer.Serialize(stream, input);
            bytResults = stream.ToArray();
        }
        return bytResults;
    }
}

编辑:在不同问题中提出的答案不适用。这个问题不是关于Protocol Buffers中的小数,而是关于protobuf-net的新版本中可以为空的小数,这应该根据文档支持。

1 个答案:

答案 0 :(得分:0)

这可能是“地图”检测中的一个小故障(在2.3中添加),应该记录为错误;但是,我怀疑可以通过禁用“地图”支持来实现解决方法

[ProtoMember(2), ProtoMap(DisableMap = true)]
public Dictionary<long, decimal?> MyDictionary { get; set; }

更新:这是bug,已在2.3.4

中修复