2014-01-05 15 views
2

我正在使用cereal庫,並試圖通過自定義構造函數獲取派生類型的shared_ptr實例,以便正確地將其導入到存檔中。我傾倒了以下documentation,但我顯然錯過了一些東西。C++ 11穀物庫無法序列化一類礦

下面是我的層次結構類:

class TextureDefinition : public std::enable_shared_from_this<TextureDefinition> { 
    template <class Archive> 
    friend void serialize(Archive & archive, TextureDefinition & texture); 
public: 
    virtual ~TextureDefinition(){} 
    std::shared_ptr<TextureHandle> makeHandle(); 
    std::shared_ptr<TextureHandle> makeHandle(const Point<int> &a_position, const Size<int> &a_size); 

    void setOnReload(std::function< void (std::shared_ptr<TextureDefinition>) > a_onReload); 
    void clearOnReload(); 

    GLuint textureId() const; 
    std::string name() const; 
    Size<int> size() const; 

    //bookkeeping 
    void reload(); 
    void cleanup(); 

protected: 
    TextureDefinition(const std::string &a_name); 

    std::string textureName; 
    Size<int> textureSize; 
    GLuint texture; 

    std::vector< std::weak_ptr<TextureHandle> > handles; 

private: 
    virtual void reloadImplementation() = 0; 
    virtual void cleanupImplementation(){} 

    std::function< void (std::shared_ptr<TextureDefinition>) > onReload; 
}; 

template <class Archive> 
void serialize(Archive & archive, TextureDefinition &texture){ 
    archive(cereal::make_nvp("name", texture.name()), cereal::make_nvp("size", texture.size()));// , cereal::make_nvp("handles", handles)); //not saving handles right now to simplify testing. 
} 

class FileTextureDefinition : public TextureDefinition { 
public: 
    static std::shared_ptr<FileTextureDefinition> make(const std::string &a_filename, bool a_repeat = false){ 
     return std::shared_ptr<FileTextureDefinition>(new FileTextureDefinition(a_filename, a_repeat)); 
    } 

    template <class Archive> 
    static FileTextureDefinition * load_and_allocate(Archive &ar){ 
     return new FileTextureDefinition("", false); 
    } 

    template <class Archive> 
    void serialize(Archive & archive){ 
     archive(cereal::base_class<TextureDefinition>(this), CEREAL_NVP(repeat)); 
     if(!handles.empty()){ 
      reload(); 
     } 
    } 
private: 
    FileTextureDefinition(const std::string &a_filename, bool a_repeat): 
     TextureDefinition(a_filename), 
     repeat(a_repeat){ 
    } 
    virtual void reloadImplementation(); 

    bool repeat; 
}; 

這是測試代碼,我試圖去運行:

void saveTest(){ 
    std::stringstream stream; 
    { 
     cereal::JSONOutputArchive archive(stream); 
     auto testSave = MV::FileTextureDefinition::make("test.png"); 
     archive(cereal::make_nvp("test", testSave)); 
    } 
    std::cout << stream.str() << std::endl; 
} 

我的「尺寸」類型不正確的序列。我也包括穀類/ types/memory.hpp,穀類/類型/ map.hpp,穀類/類型/ string.hpp和穀類/類型/ base_class.hpp,但是當我嘗試運行上面的測試FileTextureDefinition時,我得到以下錯誤:

1>C:\git\external\cereal\include\cereal/cereal.hpp(432): error C2338: Trying to serialize an unserializable type with an output archive. 
1> 
1> Types must either have a serialize function, or separate save/load functions (but not both). 
1> In addition, you may not mix versioned with non-versioned serialization functions. 
1> Serialize functions generally have the following signature: 
1> 
1> template<class Archive> 
1> void serialize(Archive & ar) 
1> { 
1>  ar(member1, member2, member3); 
1> } 
1> 
1> 
1>   C:\git\external\cereal\include\cereal/cereal.hpp(329) : see reference to function template instantiation 'cereal::JSONOutputArchive &cereal::OutputArchive<cereal::JSONOutputArchive,0>::processImpl<std::shared_ptr<MV::FileTextureDefinition>>(const T &)' being compiled 
1>   with 
1>   [ 
1>    T=std::shared_ptr<MV::FileTextureDefinition> 
1>   ] 
1>   C:\git\external\cereal\include\cereal/cereal.hpp(329) : see reference to function template instantiation 'cereal::JSONOutputArchive &cereal::OutputArchive<cereal::JSONOutputArchive,0>::processImpl<std::shared_ptr<MV::FileTextureDefinition>>(const T &)' being compiled 
1>   with 
1>   [ 
1>    T=std::shared_ptr<MV::FileTextureDefinition> 
1>   ] 
1>   C:\git\external\cereal\include\cereal/cereal.hpp(245) : see reference to function template instantiation 'void cereal::OutputArchive<cereal::JSONOutputArchive,0>::process<std::shared_ptr<MV::FileTextureDefinition>&>(T)' being compiled 
1>   with 
1>   [ 
1>    T=std::shared_ptr<MV::FileTextureDefinition> & 
1>   ] 
1>   C:\git\external\cereal\include\cereal/cereal.hpp(245) : see reference to function template instantiation 'void cereal::OutputArchive<cereal::JSONOutputArchive,0>::process<std::shared_ptr<MV::FileTextureDefinition>&>(T)' being compiled 
1>   with 
1>   [ 
1>    T=std::shared_ptr<MV::FileTextureDefinition> & 
1>   ] 
1>   C:\git\external\cereal\include\cereal/archives/json.hpp(711) : see reference to function template instantiation 'ArchiveType &cereal::OutputArchive<ArchiveType,0>::operator()<_Ty&>(_Ty &)' being compiled 
1>   with 
1>   [ 
1>    ArchiveType=cereal::JSONOutputArchive 
1> ,   _Ty=std::shared_ptr<MV::FileTextureDefinition> 
1>   ] 
1>   C:\git\external\cereal\include\cereal/archives/json.hpp(711) : see reference to function template instantiation 'ArchiveType &cereal::OutputArchive<ArchiveType,0>::operator()<_Ty&>(_Ty &)' being compiled 
1>   with 
1>   [ 
1>    ArchiveType=cereal::JSONOutputArchive 
1> ,   _Ty=std::shared_ptr<MV::FileTextureDefinition> 
1>   ] 
1>   C:\git\external\cereal\include\cereal/cereal.hpp(404) : see reference to function template instantiation 'void cereal::save<std::shared_ptr<MV::FileTextureDefinition>&>(cereal::JSONOutputArchive &,const cereal::NameValuePair<std::shared_ptr<MV::FileTextureDefinition> &> &)' being compiled 
1>   C:\git\external\cereal\include\cereal/cereal.hpp(329) : see reference to function template instantiation 'cereal::JSONOutputArchive &cereal::OutputArchive<cereal::JSONOutputArchive,0>::processImpl<T>(const T &)' being compiled 
1>   with 
1>   [ 
1>    T=cereal::NameValuePair<std::shared_ptr<MV::FileTextureDefinition> &> 
1>   ] 
1>   C:\git\external\cereal\include\cereal/cereal.hpp(329) : see reference to function template instantiation 'cereal::JSONOutputArchive &cereal::OutputArchive<cereal::JSONOutputArchive,0>::processImpl<T>(const T &)' being compiled 
1>   with 
1>   [ 
1>    T=cereal::NameValuePair<std::shared_ptr<MV::FileTextureDefinition> &> 
1>   ] 
1>   C:\git\external\cereal\include\cereal/cereal.hpp(245) : see reference to function template instantiation 'void cereal::OutputArchive<cereal::JSONOutputArchive,0>::process<_Ty>(T &&)' being compiled 
1>   with 
1>   [ 
1>    _Ty=cereal::NameValuePair<std::shared_ptr<MV::FileTextureDefinition> &> 
1> ,   T=cereal::NameValuePair<std::shared_ptr<MV::FileTextureDefinition> &> 
1>   ] 
1>   C:\git\external\cereal\include\cereal/cereal.hpp(245) : see reference to function template instantiation 'void cereal::OutputArchive<cereal::JSONOutputArchive,0>::process<_Ty>(T &&)' being compiled 
1>   with 
1>   [ 
1>    _Ty=cereal::NameValuePair<std::shared_ptr<MV::FileTextureDefinition> &> 
1> ,   T=cereal::NameValuePair<std::shared_ptr<MV::FileTextureDefinition> &> 
1>   ] 
1>   c:\git\wargameclient\source\game.h(49) : see reference to function template instantiation 'ArchiveType &cereal::OutputArchive<ArchiveType,0>::operator()<cereal::NameValuePair<std::shared_ptr<MV::FileTextureDefinition> &>>(cereal::NameValuePair<std::shared_ptr<MV::FileTextureDefinition> &> &&)' being compiled 
1>   with 
1>   [ 
1>    ArchiveType=cereal::JSONOutputArchive 
1>   ] 
1>   c:\git\wargameclient\source\game.h(49) : see reference to function template instantiation 'ArchiveType &cereal::OutputArchive<ArchiveType,0>::operator()<cereal::NameValuePair<std::shared_ptr<MV::FileTextureDefinition> &>>(cereal::NameValuePair<std::shared_ptr<MV::FileTextureDefinition> &> &&)' being compiled 
1>   with 
1>   [ 
1>    ArchiveType=cereal::JSONOutputArchive 
1>   ] 

的textures.h頭文件的完整鏈接,可以發現here上引擎收錄,但我已經包括了我認爲是相關章節。

回答

4

啊哈!所以這個問題很簡單。我習慣於自動處理多態性,但對於穀物,您必須專門註冊類型。

CEREAL_REGISTER_TYPE(MV::FileTextureDefinition); 
CEREAL_REGISTER_TYPE(MV::DynamicTextureDefinition); 
CEREAL_REGISTER_TYPE(MV::SurfaceTextureDefinition); 
+3

我有一種感覺,這是你的問題,但還沒有來得及到:這是通過將以下三行我textures.cpp文件,包括「穀物/類型/ polymorphic.hpp」解決了我仔細看看這個。那些想獲得更多信息的人可以在這裏看到:http://uscilab.github.io/cereal/polymorphism.html – Azoth

+0

我現在正在處理更多的問題,當一切都正確連接時,我會繼續併發布最終textures.h供人們比較我的初始損壞版本和已完成的工作版本。 – M2tM