2016-11-11 1 views
1

프로토콜 버퍼 버전 3에서는 선택적 정수 값을 갖는 가장 좋은 방법을 알아 내려고합니다. 0과 없음은 별개의 경우 여야합니다.프로토콜 버퍼 옵션 정수 (0과 구별 할 수 없음)

message int64Option { 
    oneof option { 
     bool empty = 14; 
     int64 value = 15; 
    } 
} 

이 좋은 생각, 아니면 더 좋은 방법이있다 : 내가 이해할 수있는 베스트 유형을하고있다?

답변

2

proto3에는 두 가지 주요 옵션이 있습니다. 첫 번째는 당신이 제안 같은 oneof를 사용하는 것입니다,하지만 실제로 당신은 단지 oneof에 하나 개의 항목이 필요합니다 : 당신은 여전히 ​​value이 없거나 제로 여부를 확인할 수 있도록

oneof option { 
    int64 value = 15; 
} 

Oneof 필드는 존재의 개념을 가지고있다. 다른 대안은 google/protobuf/wrappers.proto에 래퍼 유형 중 하나를 사용하는 것입니다. 이러한 래퍼는 원시 형식을 사용하여 메시지로 래핑하므로 하위 메시지 필드가 존재하기 때문에 상황에 도움이됩니다. 여기에 Int64 래퍼 예를 들면 모습입니다 :

// Wrapper message for `int64`. 
// 
// The JSON representation for `Int64Value` is JSON string. 
message Int64Value { 
    // The int64 value. 
    int64 value = 1; 
} 

것은 마지막으로 고려해야 할 한 가지가 항상 proto2을 계속 사용할 수 있다는 것입니다. proto2 및 proto3 스타일은 모두 protobuf 버전 3.0 이상에서 지원되며 proto2를 무한정 지원할 계획입니다.

+0

눈부셔, 감사합니다! 호기심에서,'map' 외에 다른 매개 변수화 된 타입을 지원할 계획이 있습니까? – acjay

+0

다른 매개 변수화 된 형식을 지원할 계획이 없다고 생각합니다 (기존 반복 된 필드도 매개 변수화 된 형식과 비슷하다고 주장 할 수 있습니다). –