2009-09-04 79 views
2

它看起來像Int64有一個0的編碼問題。其他值爲Int64 ok。protobuf.net不是序列化零

[ProtoMember(3)] private readonly Int64 _intValue 

被反序列化Int64.MinValue

任何想法?

我確認了這個錯誤。如果_Val == 0

[ProtoContract]

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); 
     } 
    } 

回答

1

抱歉耽擱這個類將無法正常連載 - 我有一個離線幾天; -p

協議緩衝區規範有一個隱含的默認值zer o在大多數類型上。爲確保合規處理,除​​非另有說明,否則將遵守此默認值。我會盡力在文檔中更清楚地說明這一點。

有幾種解決方案:

  • 添加[DefaultValue(int.MinValue)]屬性字段設置明確的默認
  • 添加IsRequired = true[ProtoMember]屬性
  • 如果使用Nullable<int>,我懷疑這將把零作爲顯式
  • 在屬性的情況下,它遵守ShouldSerialize*模式,所以如果Val屬性(使用setter)具有[ProtoMember],它會尋找bool ShouldSerializeVal()