2009-09-04 5 views
2

Int64처럼 0에 인코딩 문제가있는 것 같습니다. 다른 값은 Int64 ok입니다. protobuf.net이 0을 직렬화하지 않음

[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 대부분의 유형에. 호환 처리를 보장하기 위해 별도로 지정하지 않는 한이 기본값을 사용합니다. 나는 이것을 문서에서 더 명확하게하려고 노력할 것이다.

는 몇 가지 솔루션이 있습니다

  • [ProtoMember] 속성
  • 당신이 Nullable<int>를 사용하는 경우, 나는 그것이 제로 처리합니다 의심에 IsRequired = true를 추가 명시 적 기본 설정 필드에 [DefaultValue(int.MinValue)] 속성을 추가 명시 적으로
  • 속성의 경우 ShouldSerialize* 패턴을 따르므로 Val 속성 (설정자 포함)이 [ProtoMember] 일 경우 bool ShouldSerializeVal()
관련 문제