2010-03-05 61 views
2

我在C#中使用protobuf-net r278,我只注意到,如果我有一個int字段的類,如果該字段的值設置爲0,該字段不正確反序列化。也就是說,反序列化時,它從類定義中獲得它的默認值。 Example類:protobuf網非反序列化0's

[ProtoBuf.ProtoContract] 
public class 
Test 
{ 
    [ProtoBuf.ProtoMember(1)] 
    public int Field1 = -1 

    [ProtoBuf.ProtoMember(2)] 
    public int Field2 = -1; 
} 

然後運行該代碼:

var test = new Test(); 
test.Field1 = 0; 
test.Field2 = 0; 
MemoryStream ms_out = new MemoryStream(); 
ProtoBuf.Serializer.Serialize(ms_out, test); 
ms_out.Seek(0, SeekOrigin.Begin); 
var deser = ProtoBuf.Serializer.Deserialize<Test>(ms_out); 

當我這樣做,deserField1 = -1Field2 = 2,而不是0。我在這裏做錯了什麼?

回答

5

與電線規格的線,有一個隱含的默認值爲零(可改爲其它的值與[DefaultValue(...)]您可以通過屬性設置IsRequired = true告訴它的行爲本身,只要你想:

[ProtoBuf.ProtoMember(1, IsRequired = true)] 
+0

感謝,正是我所需要的 – toasteroven 2010-03-05 20:04:11

+0

是不是一個錯誤的行爲?這可能很容易導致數據難以找出損壞 – mafu 2012-02-22 15:57:50

+0

@mafutrct由於沒有官方規範映射到POCO和推斷模式,這是不可能回答的;但是,在v2中有一個關閉零默認行爲的開關 – 2012-02-22 16:16:29