2010-07-05 6 views
2

나는 네트워크를 통해 데이터를 송수신해야하는 프로그램을 만들고 있습니다. 나는 객체 직렬화를 결코 다루지 않았다. Boost 및 Google 프로토콜 버퍼에 대한 몇 가지 권장 사항을 읽었습니다. Linux에서 사용하는 것이 가장 좋습니다.Linux 용 C++ 객체 직렬화

다른 사람을 알고 계시다면 협조 해 주셔서 감사합니다.

감사합니다.

+0

이 질문의 가능한 복제본은 무엇입니까? http://stackoverflow.com/questions/1855628/network-protocol-object-serialization-in-c – bjg

+0

특정 요구 사항을 모른 채 어떻게 * 최선 *을 결정할 수 있습니까? –

답변

6

Boost.Serialization을 사용하여 객체를 직렬화하고 소켓을 통해 전송했습니다. 그것은 당신이 그들을

class Foo 
{ 
public: 
    template<class Archive> 
    void serialize(Archive& ar, const unsigned int version) 
    { 
     ar & _foo; 
     ar & _bar; 
    } 

    int _foo; 
    int _bar; 
}; 

또는 비 간섭 적에 액세스 할 수있는 경우 당신이

namespace boost { 
namespace serialization { 

template<class Archive> 
void serialize(Archive& ar, Foo& f, const unsigned int version) 
{ 
    ar & f._foo; 
    ar & f._bar; 
} 

} // namespace serialization 
} // namespace boost 

를 직렬화하는 데 필요한 개체에 액세스 할 수없는 경우 객체를 간섭 직렬화 할 수있는, 매우 유연한 도서관의 (_foo_bar 여기에) 노출되지 않으면 Foo를 직렬화하는 트릭입니다. documentation은 이것을 아주 잘 설명합니다. Foo을 serialize하려면 boost::archive 네임 스페이스의 개체 (텍스트, 이진 또는 xml)를 사용합니다. 당신은 당신이 소켓과 버퍼를 사용하게 될 네트워크를 도입 할 때 푸 객체에 아카이브를 재구성

std::stringstream ss; 
boost::archive::text_oarchive ar(ss); 
Foo foo; 
foo._foo = 1; 
foo._bar = 2; 
ar << foo; 

분명이 예는 매우 간단하다 그래서

boost::archive::text_iarchive ar(ss); 
Foo foo 
ar >> foo; 

주처럼 수행하고있다.

+0

도움에 감사드립니다. 나는 시도 할 것이다. –

+0

@ 루카스 당신의 질문에 답을 얻었을 때 대답 중 하나를 받아 들여야합니다. –

1

네트워크를 통해 데이터를 전송하는 경우 XML이 아닌 이진 형식의 직렬화를 사용하는 것이 좋습니다. Qt offers classes for that을 사용하면 Qt의 메타 시스템에 알려진 클래스를 데이터 스트림으로 전달할 수 있습니다.

문제는 C++이 언어 기능으로 인트로 스펙 션을 실제로 지원하지 않기 때문에 직렬화 할 데이터를 알아야한다는 것입니다.

대부분의 경우 길이 표시기 (빅 엔디안 사용) 다음에 데이터가 데이터를 직렬화하는 좋은 방법입니다.