2

看起来 0 作为 Int64 存在编码问题。其他值如 Int64 ok。

[ProtoMember(3)] private readonly Int64 _intValue

被反序列化为 Int64.MinValue

任何想法?

我确认错误。如果 _val == 0,此类将无法正确序列化

[原合同]

class VerySimple
{
    [ProtoMember(1)]
    private readonly Int64 _val = Int64.MinValue;

    public VerySimple(long val)
    {
        _val = val;
    }

    public long Val
    {
        get { return _val; }            
    }

    public VerySimple()
    {
    }
}

此测试失败

[测试]

    public void TestProtobufEncodingSimple()
    {
        //OK
        {
            MemoryStream stream = new MemoryStream();
            Serializer.Serialize(stream, new VerySimple(1));
            stream.Seek(0, SeekOrigin.Begin);
            VerySimple reloaded = Serializer.Deserialize<VerySimple>(stream);
            Assert.AreEqual(reloaded.Val, 1L);
        }

        //KO
        {
            MemoryStream stream = new MemoryStream();
            Serializer.Serialize(stream, new VerySimple(0));
            stream.Seek(0, SeekOrigin.Begin);
            VerySimple reloaded = Serializer.Deserialize<VerySimple>(stream);
            Assert.AreEqual(reloaded.Val, 0L);
        }
    }
4

1 回答 1

1

抱歉耽搁了-我有几天离线;-p

协议缓冲区规范对大多数类型都有一个隐式默认为零。为确保合规处理,除​​非您另有说明,否则它会尊重此默认设置。我将尝试在文档中更清楚地说明这一点。

有几种解决方案:

  • 向字段添加[DefaultValue(int.MinValue)]属性以设置显式默认值
  • 添加IsRequired = true[ProtoMember]属性
  • 如果您使用Nullable<int>,我怀疑它会将零视为显式
  • 在属性的情况下,它尊重ShouldSerialize*模式,所以如果Val属性(带有 setter)有[ProtoMember],它会寻找bool ShouldSerializeVal()
于 2009-09-07T19:55:33.197 回答