4

私はシリアルを初めて使用し、JSON 文字列を逆シリアル化する方法を理解するのに苦労しています。残念ながら、私の職場のファイアウォールは、メッセージ ボードに投稿するために Google グループにアクセスすることを制限しています。

JSON文字列に変換できるクラスがありますが、一生文字列を取得してクラスを再作成することはできません。学校を卒業したばかりで、最初の仕事であり、私の深みには程遠いです。

これは私が得ているエラーです:

「cereal::RapidJSONException」のインスタンスをスローした後に呼び出された終了 what(): rapidjson 内部アサーション エラー: IsObject()

以下は MyClass.hpp クラスです。

#include <cstdio>
#include <iostream>
#include <string>
#include "../cereal/access.hpp"

class MyClass{
Public: //function declarations 
     template<class Archive> // public serialization (normal)
     void serialize(Archive & ar)
     {
         ar(x, y, z);
     }

private: // member variables 
    string x; 
    int y; 
    bool z;
};

以下は私のMain.cppです:

#include <../cereal/types/unordered_map.hpp>
#include <../cereal/types/memory.hpp>
#include <../cereal/types/concepts/pair_associative_container.hpp>
#include <../cereal/archives/json.hpp>
#include <../cereal/types/vector.hpp>

#include <iostream>
#include <fstream>

#include "MyClass.hpp"

int main(){
    // serialize (this part all works... i think)
    {
        // create a class object and give it some data 
        MyClass data("hello", 6, true);
        // create a string stream object 
        std::stringstream os;
        // assign the string stream object to the Output Archive 
        cereal::JSONOutputArchive archive_out(os);
        //write data to the output archive 
        archive_out(CEREAL_NVP( data ));
        // write the string stream buffer to a variable 
        string json_str = os.str();
    }   
    // deserialize
    {
        // create a string stream object and pass it the string variable holding the JSON archive 
        std::stringstream is( json_str );
        // pass the stream sting object into the input archive **** this is the line of code that generates the error
        cereal::JSONInputArchive archive_in( is );
        // create a new object of MyClass
        MyClass data_new;
        // use input archive to write data to my class
        archive_in( data_new );
    }
}
4

1 に答える 1