2009-12-06 3 views
1

TCP/IP를 통해 데이터를 보내야하는 C++ 코드를 작성 중입니다. 이 코드를 Linux/Windows/Osx에서 이식 할 수 있기를 바랍니다. 그것이 내가 휴대용 네트워크 코드를 작성 처음으로 지금, 나는 기본적으로 같은 특정 개체에 추가 할 몇 가지 간단한 기능이 필요합니다 지금에 필요한 모든 것입니다C++에서 네트워크 프로토콜 객체 직렬화

class myclass{ 

...member... 

public: 

    string serialize(){ 
    std::ostringstream out(); 
    out << member1; 
    out << member2; 
    out << member3; 
    return out.str(); 
    } 

} 

을 .... 어쨌든 ostringstream 관련 문서를 읽기 시작하고 바이너리/텍스트 문제가 발생합니다. 사실 그것은 줄 바꿈을 영 시스템의 올바른 순서로 변환 할 것입니다. 예를 들어, 멤버가 const char * foo = "Hello \ nMan \ n"에 대한 포인터 인 경우, 이는 리눅스의 특정 바이트 시퀀스로 변환되고, 다른 바이트 시퀀스는 Windows ... 등으로 변환됩니다. 내 바이트는 인터넷을 통해 패킷으로 이동하고, 다른 OS 머신이이를 읽으며 문제가 발생할 것이라고 생각합니다 ... 이제는 ostringstreamostringstream(ios::bin)으로 초기화 할 수 있다고 읽었습니다 ... 문제가 해결 될 수 있습니까? 당신이 많이 주시면 감사하겠습니다 몇 명확히 선을 보낼 수 있다면 ??? 내가, 전체 그림에 대한 혼란 해요 istringstream(ios::bin)를 사용하는 데 직렬화 기능을 사용합니다.

감사합니다.

답변

9

을 왜 ?

: 당신이 자신의 목표에서

에 구축 할 수 Boost.Serialization 같은 큰 라이브러리가 수동으로 경우 모든

데이터 이식성 - 하나의 플랫폼에서 작성된 바이트 스트림은 다른 모든 스트림에서 읽을 수 있어야합니다.

  • 깊은 포인터를 저장 및 복원 :

또한 관심의 당신은 점 4, 5 수 있습니다에 대한. 즉, 포인터 저장 및 복원은 포인터를 저장하고 지시 된 데이터를 복원합니다.

  • 공유 데이터에 대한 포인터의 올바른 복원.
  • +1

    예. 부스트 직렬화에 대해 알아볼 것 같아요 ... 난 diffucult 것으로 생각했지만 튜토리얼을보고 나서 이미 사용하고 있습니다. 좋은 선택 인 것 같아. gf와 Dirk에게 감사드립니다. – gotch4

    8

    파견 - 상기 Boost::Serialization 또는 Google Protocol Buffers 같은 테스트를 직렬화 라이브러리를 사용합니다. 이것들은 더 이상의 의존성을 가져서는 안된다. 당신은 완전히 새로운 프레임 워크 열려 있으면

    , 다음 Qt는 또한 Qt Serialization

    0

    또 다른 옵션은 ACE 프레임 워크가있다. CORBA 정렬 화 (클래스 ACE_InputCDRACE_OutputCDR 참조)를 사용하여 직렬화/직렬화 해제를 제공합니다. ACE를 모른다면 완전한 CORBA 런타임을 포함한 거대한 프레임 워크입니다. 그러나 직렬화를 위해 핵심 ACE 라이브러리 만 있으면됩니다.