2013-01-21 2 views
1

일부 메시지 구조체가 있습니다. 각 문자열은 문자열로 직렬화되고 문자열에서 직렬화 해제 될 수 있습니다. 직렬화 부분의 경우 오버로드 연산자 < <을 사용합니다. 그러나 역 직렬화 부분에 대해서는 적절한 방법을 생각할 수 없습니다. 그래서 클래스를 사용하여 문자열을 파싱합니다. 최근에, 나는 부스트 직렬화를 발견했다. 이 목적을 달성 할 수 있는지, 아니면 더 좋은 아이디어가 있는지 나는 모른다.struct serialization

struct S 
{ 
    int32_t type; 
    double a; 
    int32_t b; 
    bool c; 
    std::string d; 

    friend std::ostream& operator<< (std::ostream& os, const S& s) 
    { 
    os << "{field1" << "=" << s.a << "|"; 
    os << "field2" << "=" << s.b << "|"; 
    os << "field3" << "=" << s.c << "|"; 
    os << "field4" << "=" << s.d << "}"; 

    return os; 
    } 
}; 

편집 : 그래서 xml archive를 사용합니다. 그러나 나는 또 다른 문제가있다. msgtype 필드로 분류되는 여러 유형의 메시지가 있기 때문에. deserialization 할 때 deserialize 할 개체를 지정하는 방법은 무엇입니까? msgtype 필드를 수동으로 검색해야합니까?

template <typename Archive> 
    void serialize(Archive &ar, const unsigned int version) 
    { 
    using boost::serialization::make_nvp; 
     ar & make_nvp("msgtype", type); 
     ar & make_nvp("field1", a); 
     ar & make_nvp("field2", b); 
     ar & make_nvp("field3", c); 
     ar & make_nvp("field4", d); 
    } 
+0

역 직렬화를 위해 무엇을 하시겠습니까? – 0x499602D2

+0

문자열 "{field1 = 1 | field2 = 2 | field3 = 1 | field4 = abc}"가 주어지면 구조체로 deserialize 될 수 있습니다. –

+0

은 사람이 읽을 수있는 "문자열"입니까? – Alex

답변

0

부스트 :: 직렬화 (내가 아는 한) 바이너리, 텍스트 및 XML을 거의 지원하지 않습니다. 그리고 그것은 (AFAIK) JSON (예를 들어 이미 완료되었거나 모르겠다)와 직렬화하도록 어렵지 않을 것입니다.

바퀴를 재발 명하고 싶다면 boost :: serialization의 디자인 원칙을 따를 수 있습니다 - 단순화 된 방식으로 다시 구현하기가 매우 쉽습니다 (링크 된 객체는 지원하지 않습니다). 대부분의 경우 필요하지 않음). 하지만 당신의 코드를보고 난

죄송합니다 ... 당신이 당신의 자신의 직렬화보다 (이미 시험) 다른 떨어지게를 사용하는 것이 더 나은 거라고 생각하지만, 당신의 디자인은

1

사용 부스트 직렬화 ... 훨씬 좋은에서이다 : 꽤 많은 당신을 위해 모든 것을 돌볼 것이 라이브러리와

http://www.boost.org/doc/libs/1_52_0/libs/serialization/doc/index.html

. 예를 들어, 당신은 당신의 구조체에이 기능을 추가 할 수 있습니다

void serialize(Archive & ar, const unsigned int version) 
{ 
    ar & a; 
    ar & b; 
    ar & c; 
    ar & d; 
} 

그런 다음 당신이 직렬화 및 역 직렬화 할 수있을 것입니다이 수행하여 :

boost::archive::text_oarchive oa(ofs); 
    // write class instance to archive 
    oa << g; 

이 :

boost::archive::text_iarchive ia(ifs); 
    // read class state from archive 
    ia >> newg; 

gnewg으로 가정하십시오.

가독성을 위해 공간을 절약하기 위해 binary_archive 또는 기타로 변경하거나 text_archive으로 변경할 수 있습니다.

편집 : 편집을 위해 부스트 직렬화가 사용자를 대신하여 처리합니다. 보관소로 연재하기 만하면 해당 보관함과 반대 위치에서 보관함을 만든 유형으로 이동하면 모든 것을 올바른 위치에 다시 넣을 수 있습니다.

저는 NVP와 XML에 익숙하지 않아서 부스트가 다를 경우 미안합니다.

+0

동의 - '결코 바퀴를 다시 발명하십시오'는 중요한 프로그래밍 원칙입니다 – gerrytan

+0

나는 내 게시물을 편집했습니다. –