2009-03-26 4 views
4

Boost.serialization을 분산 시스템 설계에 사용되는 프로토콜 버퍼로 대체 할 계획입니다. 프로토콜 버퍼가 표준 컨테이너와 같은 복잡한 데이터 구조를 지원하는 방법은 무엇입니까? 예를 들어프로토콜 버퍼는 표준 컨테이너의 직렬화/직렬화를 어떻게 지원합니까?

는, 이러한 클래스는 우리의 경우에 직렬화/직렬화 할 필요합니다

class Foo 
{ 
    std::vector< std::pair< unsigned int, std::vector< std::pair< int, int> > > > data; 
}; 

답변

4

프로토콜 버퍼는 .proto 파일을 취하고 적절한 직렬화 루틴을 생성하는 파서를 사용합니다. this을 참조하십시오.

업데이트 : 당신의 프로토 파일에

message MyCollection { 
    repeated string str = 1; 
} 

: 당신은 같은 문자열의 벡터를 나타낼 수 있습니다.

및 사용 :

std::vector<std::string> my_strings; 
// add strings to vector MyCollection proto; 
vector<string>::iterator e = my_strings.end(); 
for (vector<string>::iterator i = my_strings.begin(); 
    i != e; 
    ++i) { 
    *proto.add_str() = *i; 
} 

이 컬렉션의 또 다른 수집/수집을 위해 확장이 용이해야한다.

+0

Google의 자습서에서는 간단한 구조를 serialize하는 방법을 제시했습니다. 내 요구 사항은 표준 컨테이너에 관한 것입니다. 위에서 언급 한대로 proto 파일을 작성하는 방법은 무엇입니까? –

+1

일부 코드로 업데이트되었습니다. – dirkgently

4

당신의 푸의 protobuf 표현이 다음과 같이합니다 :

message IntPair { 
    required int32 first = 1; 
    required int32 second = 2; 
}; 

message FooElem { 
    required uint32 first = 1; 
    repeated IntPair second = 2; 
}; 

message Foo { 
    repeated FooElem data = 1; 
}; 

Boost.Serialization이하는 것처럼 프로토콜 버퍼는 자신의 구조에서에 /에 "완벽"(드) 직렬화를 제공하지 않습니다 . 위와 같은 파일에서 protoc 컴파일러를 실행하여 생성 된 객체로 작업합니다.

이러한 생성 된 클래스는 std::pairstd::vector 멤버를 포함하지 않으므로 기존 Foo 구조로 작업을 계속하려면 생성 된 개체에서 데이터를 복사해야합니다.

관련 문제