2017-05-07 6 views
2

Cereal을 사용하여 기본 생성자없이 오브젝트를 직렬화하려고합니다. 이러한 객체를 직접 또는 스마트 포인터를 통해 저장합니다. 나는 용기에 객체를 넣을 때, 는 더 이상 컴파일되지 : 시리얼은 기본 생성자없이 객체의 벡터를/저장 복원 얻을 수있는 방법이시리얼 : 기본 생성자없이 오브젝트 벡터를 비 직렬화

error: no matching function for call to ‘Node::Node()’

있습니까?

내 테스트 코드 :

#include <fstream> 
#include <cereal/archives/json.hpp> 
#include <cereal/types/memory.hpp> 
#include <cereal/types/vector.hpp> 


class Node { 
public: 
    Node(int* parent) {}; 

    int value_1; 

    template<class Archive> 
    void serialize(Archive& archive) { 
     archive(
       CEREAL_NVP(value_1) 
     ); 
    } 

    template<class Archive> 
    static void load_and_construct(Archive& archive, cereal::construct<Node>& construct) { 
     construct(nullptr); 
     construct->serialize(archive); 
    } 
}; 

int main() { 
    std::string file_path = "../data/nodes.json"; 
    Node node_1{nullptr}; // this would serialize 

    std::vector<Node> nodes; // this does not 
    nodes.push_back(Node{nullptr}); 
    nodes.push_back(Node{nullptr}); 

    std::vector<std::unique_ptr<Node>> node_ptrs; // this would serialize 
    node_ptrs.push_back(std::make_unique<Node>(nullptr)); 
    node_ptrs.push_back(std::make_unique<Node>(nullptr)); 

    { //store vector 
     std::ofstream out_file(file_path); 
     cereal::JSONOutputArchive out_archive(out_file); 
     out_archive(CEREAL_NVP(nodes)); 
    } 

    { // load vector 
     std::ifstream in_file(file_path); 
     cereal::JSONInputArchive in_archive(in_file); 
     in_archive(nodes); 
    } 

    return 0; 
} 

답변

0

는 지금까지 내가하는 방식이 라이브러리 작품을 이해, 적어도 동적으로 할당 된 객체에 대한 기본 생성자가없는 뭔가를 역 직렬화 할 수있는 방법이 없습니다.

이 아래의 논리는 다음

  1. 당신은 당신이
  2. 시리얼이에 대해 알고하지 않는 메모리의 적절한 양을 할당해야 그렇게하기 위해서는 vector<Node>
  3. 를 역 직렬화 할 필요가 생성자 자체로 객체 메모리를 올바르게 할당 할 수 없음
  4. 적절한 객체 구축을 제공하려면 기본 생성자가 필요합니다.
+1

기본 생성자가없는 형식을로드하는 시나리오를 생각해보십시오. 시리얼의 직렬화에 대한 인터페이스는 직렬화 된 데이터로 인스턴스화 할 오브젝트에 대한 참조를 전달해야합니다. 기본 생성자가없는 경우 사용자 (사용자)는 시리얼 개체가 표시되기 전에 이미 이러한 개체를 초기화해야합니다. 대안은 곡물이 동적으로 생성 된 (즉, 포인터) 객체에서만 발생할 수있는 객체의 실제 구성을 수행하는 것이므로 시리얼은 'load_and_construct'에서처럼 생성자에 전달할 인수를 미리로드 할 수 있습니다. – Azoth