2009-09-04 6 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ほとんどのタイプで。準拠した取り扱いを保証するため、あなたが特に指示しない限り、このデフォルトを尊重します。私はこれをドキュメントでより明確にしようとします。

いくつかのソリューションがあります

  • は、あなたがNullable<int>を使用している場合、私はそれがゼロに扱います疑う[ProtoMember]属性
  • IsRequired = trueを追加明示的なデフォルト
  • を設定するフィールドに[DefaultValue(int.MinValue)]属性を追加します。
  • プロパティの場合はShouldSerialize*パターンを尊重しているため、Valプロパティ(セッター付き)が[ProtoMember]、それはbool ShouldSerializeVal()
関連する問題