質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

3659閲覧

C++でネストした構造体をシリアライズする方法が知りたい

alicealice

総合スコア5

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

1グッド

1クリップ

投稿2020/11/09 11:08

#実現したいこと

C++超初心者です。表題の通りネストした構造体をシリアライズしてjsonファイルに出力したく下記のようなコードを書いたのですが、自力ではエラーを解決できそうにありません。
誠に未熟な質問で恐縮ですが、エラーを解消し期待する出力結果を得るにはどうコードを修正すればよいか、どなたかご教授お願いします。

#ソースコード

C++

1#include <iostream> 2#include <vector> 3#include <fstream> 4#include <map> 5#include <cereal/types/map.hpp> 6#include <cereal/types/string.hpp> 7#include <cereal/archives/json.hpp> 8 9struct Fuga //構造体(子) 10{ 11 12 std::string str; 13 std::vector<float> vec; 14 15 template<class Archive> 16 void serialize(Archive& ar) 17 { 18 ar(CEREAL_NVP(str), CEREAL_NVP(vec)); 19 } 20 21}; 22 23struct Hoge //構造体(親) 24{ 25 int id; 26 struct Fuga fuga; 27 28 template<class Archive> 29 void serialize(Archive& ar) 30 { 31 ar(CEREAL_NVP(id), CEREAL_NVP(fuga)); 32 } 33 34}; 35 36int main() 37{ 38 Hoge hoge; 39 hoge.id = 1; 40 hoge.fuga.str = "hogehoge"; 41 hoge.fuga.vec = {0.2, 0.3, 0.5}; 42 43 //シリアライズして出力 44 std::ofstream os("out.json", std::ios::out); 45 cereal::JSONOutputArchive archiveFile(os); 46 hoge.serialize(archiveFile); 47 48} 49 50 51

#期待する出力結果

json

1{ 2 "id": 1, 3 "fuga": { 4 "str": "hogehoge", 5 "vec": [ 0.2, 0.3, 0.5 ] 6 } 7} 8

#エラーメッセージ
cereal could not find any output serialization functions for the provided type and archive combination.

#動作環境、ライブラリ
・Windows10 Pro
・Visual Studio Community 2019
・cereal (シリアライズ用ライブラリ)

tmatsugaki👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

cerialは使ったことがありませんが、vectorをシリアライズしたいなら cereal/types/vector.hpp をインクルードしなければいけないのではないでしょうか。

投稿2020/11/09 11:38

kazatsuyu

総合スコア158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

alicealice

2020/11/09 12:11

ご回答ありがとうございます! cereal/types/vector.hppをインクルードしたところエラーはなくなりました! しかし、出力結果が{ "id": 1, "fuga": {}}となり、構造体(子)のシリアライズがうまくいきません…
kazatsuyu

2020/11/09 14:49

cerialのアーカイブクラスはデストラクタが呼ばれるまで出力が終わらない可能性があるようですが、デストラクタの呼ばれる順によっては未定義動作を踏む危険性があるような気がします。 { cereal::JSONOutputArchive archiveFile(os); hoge.serialize(archiveFile); } などのように {} で囲んでスコープを区切ってみてはどうでしょうか。
alicealice

2020/11/10 01:08

返信ありがとうございます。お恥ずかしながらar(CEREAL_NVP(str), CEREAL_NVP(vec)); の部分をコメントアウトしていたのに気づきませんでした… コメントアウト外したら期待通りの動作を確認できました! 確かにデフォルトではスレッド安全ではないことが書かれてますね、仰ってる方法等で対応いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問