2012-02-22 3 views
2

는 구조가 직렬화 고려 :boost :: serialization :: traits의 구체적인 예는 무엇입니까?

struct MyStruct { 
    int a; 
    std::string b; 

template<class Archive> 
void serialize(Archive &ar, const unsigned int) 
    { 
    ar & a & b; 
    } 
}; 

내가 명시 적으로 track_neverobject_serializable 모두로, 직렬화 :: 특징 :: 부스트를 사용하여 태그를 지정할. 나는 traits docs을 쳐다 봤지만, 어떻게 적용 할 것인가에 대한 내 마음을 갖지 못하고 어디에서든지 예제를 찾을 수 없습니다. 그래서 ...

a)이 특정 클래스에 특성을 적용하는 코드는 무엇입니까?

b) 각각의 위치를 ​​확인하는 BOOST_STATIC_ASSERT()은 무엇입니까?

c)이 유형을 직접 처리 할 수있는 일반적인 아카이브 클래스에는 멤버 함수 나 템플릿이 없으므로이 클래스 primitive_type을 만들 수 없다고 가정합니다. 옳은?

플랫폼 간 호환성 또는 버전 간 아카이브 호환성에 대해서는 신경 쓰지 않고 MyStruct에 대한 빠른 읽기 (쓰기) 및 침입 만 가능하지만 가능한 경우 두 가지 방법으로 모두 완료하는 것이 좋습니다.

외부 클래스 정의의 다음 두 줄을 쓸 필요 것 : MyStruct 이후

답변

2

당신이 BOOST_CLASS_IMPLEMENTATIONBOOST_CLASS_TRACKING 매크로를 사용하기 만하면 모두가 특색을 적용 할 템플릿 사용 구조체 또는 클래스되지 않습니다 :

BOOST_STATIC_ASSERT(boost::serialization::implementation_level<MyStruct>::value 
        == boost::serialization::object_serializable); 
BOOST_STATIC_ASSERT(boost::serialization::tracking_level<MyStruct>::value 
        == boost::serialization::track_never); 
:

BOOST_CLASS_IMPLEMENTATION(MyStruct, boost::serialization::object_serializable); 
BOOST_CLASS_TRACKING(MyStruct, boost::serialization::track_never); 

BOOST_STATIC_ASSERT는() 옳은 일처럼 보이는 일을하는지 확인합니다

원시 타입이 아니기 때문에 이것을 원시 타입으로 만드는 것이 이해가되지 않는다고 말할 수 있습니다.

+1

위의 두 매크로는 사용자가 지정한 순서와 정확히 일치해야합니다. 나는 그것들을 뒤집어 놓았고 그것이 나를 위해 일하지 않는 이유입니다. 끝의 세미콜론은 필수는 아니지만 해를 끼치 지 마십시오. (모든 MinGW-32/gcc-4.4입니다.) – JimB