2012-12-18 4 views
2

다음의 직렬화 예제를 고려하면이 데이터가 const이고 직렬화 함수가 const 함수가 아닌 경우 데이터 저장에 어떻게 대처할 수 있습니까?부스트 직렬화가 실제로 const 객체를 저장하는 방법

어딘가에 const 캐스트가 있습니까?

struct Settings 
    { 
    Settings(); 
    uint32_t buffers_size; 
    uint32_t messages; 
    }; 

    template < class Archive > 
    void serialize(Archive& ar, Settings& settings, unsigned int /*version*/) 
    { 
    using boost::serialization::make_nvp; 
    ar 
     & make_nvp<uint32_t>("buffers_size", settings.buffers_size) 
     & make_nvp<uint32_t>("messages", settings.messages); 
    } 
+0

내 생각에 파일, 네트워크 스트림 등에 물건을 쓰는 데별로 도움이되지 않는'const' 및'volatile' 한정자는 무시됩니다. –

+0

const 정확성이 필요한 경우 [serialize를 'save' ('const')와'load' (''const'')가 아닙니다.] (http://www.boost.org/doc/libs/release/libs/serialization/doc/serialization.html#splitting). –

+0

@LucTouraille :로드/저장과 함께하는 prblem은 코드가 두 개로 분리되어 있으며 유지 관리가 어렵다는 것입니다. – Arthur

답변

2

내가 알 수있는 한, const는 객체를 저장하기 전에 실제로 제거됩니다. 이 메소드가 불려

template<class Archive, class T> 
BOOST_DLLEXPORT void oserializer<Archive, T>::save_object_data(
    basic_oarchive & ar,  
    const void *x 
) const { 
    // make sure call is routed through the highest interface that might 
    // be specialized by the user. 
    BOOST_STATIC_ASSERT(boost::is_const<T>::value == false); 
    boost::serialization::serialize_adl(
     boost::serialization::smart_cast_reference<Archive &>(ar), 
     * static_cast<T *>(const_cast<void *>(x)), 
     version() 
    ); 
} 

하기 전에 직렬화 된 객체 참조하는 const void *로 바뀌 여기에 두 번째 매개 변수에 대응 : 나는 관련 코드가 oserializer.hpp에 생각합니다. 이 포인터의 constness가 멀리 캐스팅되고 결과 포인터가 적절한 포인터 유형으로 형변환 된 다음 역 참조됩니다.

이것은 const 객체를 직렬화 할 때 정의되지 않은 동작을 호출의 가능성의 문제를 제기하십시오 serialize 회원/무료 기능은 어떻게 든 객체, 다음 const 객체를 생성하고 아카이브에 저장을 수정하는 경우 정의되지 않은 것입니다 행동 , 그리고 컴파일 타임에 주목! 당신이 saveload에 기능을 분할하는 경우

, 당신은 실수로 객체를 수정하지 못하도록하는 constsave 표시해야합니다.

+0

모양을 가져 주셔서 감사합니다 ... – Arthur