2014-11-14 1 views
3

이제 Google protobuf를 사용하고 있으며지도 구조를 사용하고 싶습니다. 그러나 Google 프로토 타입에 구현 된 데이터 구조가 없다는 것을 알았습니다.Google Protobuf를 사용하여지도 구조를 구현하는 방법

내 문제는 매우 간단합니다. 나는 '페이지 번호 (uint32_t)'라는 구조와 매우 간단한 내용을 가지고있다. 내가 원하는 것은이 페이지 번호를 키로 사용하고 내용을 가치로 사용하는 것입니다. 이것은 공간 및 속도 요구 사항을 모두 충족시켜야합니다. 그러나 Protobuf에는 그러한 데이터 구조가 없습니다.

내가 사용하는 방법은 다음과 같이이다 : 페이지의

message MyPageContent { 
    required uint32 contentA = 1; 
    required uint32 contentB = 2; 
} 

message MyTable { 
    repeated MyPageContent table= 1; 
} 

총 수는 알려져있다. 그래서 내 프로그램의 시작 부분에 특별한 값 (이 값은 페이지가 없다는 것을 알려주는 데 사용되며 아무도 내용을 사용하지 말아야합니다.)로 테이블에 모든 페이지를 추가합니다. 이렇게하면 페이지 번호를 암묵적으로 사용할 수 있습니다. 색인을 생성합니다. 페이지가 준비되면 테이블의 해당 값을 변경합니다. 사람들은 직접 페이지 번호를 색인으로 사용하여 콘텐츠에 액세스합니다. 이 방법은 많은 공간을 소비합니다. 많은 페이지가 준비되지 않았고 사람들에게 준비되지 않은 것을 알리기 위해 특별한 가치를 부여했습니다. 그러나 액세스 시간은 빠릅니다.

다른 방법은 같은 것을 할 수 있습니다 : 준비가되면 이런 식으로

message MyTable { 
    repeated uint32 pageNum = 1; 
    repeated MyPageContent myContent = 2; 
} 

, 나는 테이블에 페이지를 추가 할 수 있습니다. 이 방법으로 테이블의 크기를 제한해야합니다. 그러나 사람들은 먼저 페이지가 테이블에 있는지 찾기 위해 선형 검색을 수행해야합니다. 이것은 많은 시간을 소비합니다.

기본적으로 이것은 protobuf에서 Map 구조체를 사용하고자하는 이유입니다. 그것은 공간과 시간을 절약합니다.

답변

1

운 좋게도, (유엔) 다행히도.

Protobuf는 데이터를 조작하기위한 라이브러리가 아니며 직렬화를위한 라이브러리입니다. 따라서 std::map 또는 다른 컨테이너에서 데이터를 조작하고 protobuf의 repeated 필드를 사용하여 직렬화하십시오. 이 변화가 일어 났을 때

+6

이 대답은 밖으로 현재 날짜 - [protobuf는지도를 지원합니다] (https://developers.google.com/protocol-buffers/docs/proto#maps) – Krease

9

는 잘 모르겠지만, 현재 (4 월 '15) ProtoBuf supports maps는 :

당신이 당신의 데이터 정의의 일부로서 연관지도를 만들려면, 프로토콜 버퍼는 편리를 제공합니다 바로 가기 구문 :

map<key_type, value_type> map_field = N;

... key_type 어떤 정수 또는 문자열 유형이 될 수있는 (그래서, 부동 소수점 유형 및 bytes 제외한 모든 스칼라 형). value_type은 모든 유형이 될 수 있습니다. 각 Project 메시지가 string 키와 관련된 프로젝트의지도를 만들려는 경우

그래서, 예를 들어, 당신은이처럼 정의 할 수 있습니다 :

map<string, Project> projects = 3;

+4

불행히도 작동하지 않는 것 같습니다. 문서가 유일한 장소 인 것처럼 보입니다. 이것은 지원됩니다. 프로토콜 컴파일러는이를 받아 들일 수 없습니다. –

+1

"프로토콜 컴파일러는이를 받아들이지 않을 것입니다." 당신은 오래된 protoc이 설치되어있는 것처럼 들립니다. 최신 버전을 갖고 ProtoBufV3를 지원합니까? –

+0

포럼을 조사한 결과, 아직 베타 버전 인 v3에서만 지원된다는 것을 알았습니다. 방금 전에 해결 방법을 사용했습니다. 감사. –

관련 문제