2014-05-09 5 views
1

void * 타입의 포인터를 가진 간단한 struct를 직렬화해야하지만, serialize 할 때 오류가 발생한다. "C2338 : boost :: serialization :: tracking_level < T> : : value! = boost :: serialization :: track_never "167 행의 shared_ptr.hpp을 가리 킵니다. 다음은 코드입니다void * 포인터 타입에 대한 부스트 직렬화가 컴파일되지 않는다

#include <boost/serialization/access.hpp> 
#include <boost/serialization/base_object.hpp> 
#include <boost/serialization/optional.hpp> 
#include <boost/serialization/map.hpp> 
#include <boost/serialization/shared_ptr.hpp> 

    struct Man 
    { 

     Man(); 
     virtual ~Man(); 


     std::list<boost::shared_ptr<void *>> condition; 

    private: 
     friend class boost::serialization::access; 
     template<class Archive> 
     void serialize(Archive &ar, const unsigned int version) 
     { 
     ar & condition; // if i comment this line.. issue goes away.. 
     } 
    }; 

    struct SuperMan 
    { 
    public: 
     SuperMan(void); 
     SuperMan(const parameter_strings & parms); 

     virtual ~SuperMan(void); 


     boost::optional<anyURI> detail; 
     boost::optional<SuperManInfo> SuperMan_info;    

    private: 
     friend class boost::serialization::access; 
     template<class Archive> 
     void serialize(Archive &ar, const unsigned int version) 
     { 
     ar & SuperMan_info; 
     ar & detail; 
     } 

    }; 

실제로는 부스트 *의 직렬화를 지원합니다.

+1

실제 코드라고 가정합니다. 변수를 직렬화 할 수 있도록하려면 boost :: serialization에 실제로 'void *'가 가리키는 내용을 말해야합니다. 직렬화의 관점에서 보았을 때, 그것은 일반적인 포인터이며, 그것을 어떻게 처리해야하는지 전혀 모른다. 그것이 예일 경우 ('shared_ptr '이 끔찍한 아이디어이기 때문에) 희망이 있다면, 더 많은 정보가 필요합니다. –

답변

1

No Boost Serialization은 void*의 serialization을 지원하지 않습니다. 단순한 이유 때문에 유형 정보가 없기 때문에 에 대해을 직렬화해야한다고 말할 수는 없습니다.

대부분의 플랫폼 에서처럼 포인터가 발생하는 값을 직렬화하는 것은 완전히 쓸모가 없습니다. 이는 실행중인 프로세스의 컨텍스트에서 임시 주소 일 뿐이며 다시 읽을 때 그 값은 의미가 없습니다.

이런 이유로 shared_ptr<void*>도 쓸데없는 생각입니다. (아마도 void*이 실제로 어떤 종류의 불투명 핸들이고, 해당 핸들에 해당하는 리소스를 해제하기 위해 사용자 정의 deleter를 사용하지 않았다면 : Rule Of Zero article).

그럼 실제로 귀하의 condition 컬렉션을 확인하십시오. 형식을 수정하여 유형을 수정하거나 직렬화 코드를 수동으로 수정하여 캐스트에 관련 데이터를 포함 시키십시오.

+0

조건은 X 유형의 변수를 가리킬 필요가 있습니다. shared_ptr 조건을 그대로 사용하여 직렬화 할 수 있습니까? – user1291401

+0

물론입니다. 왜 다른 짓을 한거야? – sehe