2013-05-17 2 views
1

클래스의 인스턴스를 serialize하고 C++/Boost 라이브러리를 사용하여 TCP 연결을 통해 보내고 싶습니다. 거기에 너무 많은 작업 예제가 있습니다 ... 일부는 버퍼에 대한 텍스트 스트림을 사용하고 일부는 tcp::iostream을 사용합니다. 어느 것이 나의 필요에 적합한 지 모르겠습니다.부스트/C++ 바이너리 형식으로 개체를 serialize하는 기본 방법

요구 사항 : 다른 아키텍처를 통해

  1. 휴대
  2. 데이터는 바이너리 형식에있을 필요 (엔디 언과 비트 수는 문제가되지 않습니다). 작동하지 않는

    // Client side: 
    boost::asio::streambuf b; 
    std::ostream os(&b); 
    boost::archive::binary_oarchive oa(os); 
    message m; // The `message' class is serializable 
    // construct `m' 
    oa << m; 
    boost::asio::write(socket,b.data(),boost::asio::transfer_all()); 
    
    // Server side: 
    boost::asio::streambuf b; 
    std::istream is(&b); 
    boost::archive::binary_iarchive ia(is); 
    boost::asio::read(socket,b,boost::asio::transfer_all()); 
    message m; 
    ia >> m; 
    

    :

현재 코드 (텍스트가 없습니다). 서버가 invalid signature 예외로 종료됩니다.

답변

1

부스트를 사용해야합니까? 비슷한 질문이있는 것 같습니다. here - Boost Serialization TODO 섹션 (여기 latest)을 참조하는 응답이 있습니다. 이식 가능한 이진 파일이 작성자의 TODO 목록에있는 것처럼 보입니다. Boost가 있는지 확실하지 않습니다. 귀하의 요구 사항을 충족시키는 솔루션 (아직).

클래스가 텍스트 기반이 아니어도 어쨌든 Boost 텍스트 직렬화 보관을 사용하는 것이 좋습니다. 단점은 속도가 느리고 직렬화 된 형식이 더 많아 지지만 이식성이 있다는 것입니다. 이 라이브러리는 플랫폼 독립적 인 언어에 독립적 인 통신을위한 것입니다 -

  • Google Protocol Buffers (GPB)에

    대안 볼 수 있습니다. '메시지'클래스를 만들고 직렬화를 정의하는 대신 GPB 사양 언어로 항목을 정의하고 GPB는 해당 사양을 구문 분석하고 해당 항목을 마샬/언 마샬링하는 코드를 생성하는 도구를 제공합니다.

  • - GPB와 비슷하지만 더 풍부한 사양 언어

바라기를 바꿔 보면 새로운 아이디어를 얻을 수 있기를 바랍니다.

+0

가능한 한 최대한 이식 가능한 코드를 작성하려고합니다. 그것이 부스트를 사용하는 이유입니다. 현재 아키텍처에 비해 바이너리 이식성을 무시할 수 있습니다. 비록 위의 동일한 기계에서 실행되지 않았지만 ... 나는 어쨌든 부스트 ASIO/직렬화 * 이진 직렬화에 대한 도움이 필요합니다. –

+0

그래서 나는이 대답을 받아 들여 다른 [SO 질문] (http://stackoverflow.com/questions/16621317/serializing-binary-data-in-boost-fails-with-invalid-signature-error)에 질문한다. 감사합니다 –

+0

나는 OP가 요구 한 것에 관심이 있고 나는 완전히 다른 길을 갔다.이 대답을 downvote 것이다. "질문 한 질문에 대답하는 방법"에 대해 ?? – CashCow

관련 문제