C++においてシリアライザ、デシリアライザというものがあると思います。
シリアライザはいいと聞きますが、
シリアライザを調べてもファイル保存と変わらないと思ってしまいます。
実際に実装もしてみましたが、少しまとまってきれいになったくらいで、
ファイル保存でもできると思ってしまいます。
おおきな強みってなんなのでしょうか?
#include <cereal/cereal.hpp>
#include <cereal/archives/json.hpp>
シリアライザはいろいろなものがありますが、自分は上記にヘッダーを使いました
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答7件
0
ベストアンサー
「シリアライザ」と「ファイル保存」では、概念のレイヤが異なる≒比較する土俵が違うと言えばよいでしょうか?
- シリアライザ(Serializer)は、「プログラム上で扱う何らかのデータ構造から、ファイル保存やネットワーク送信を可能とするために、バイト列へと変換する機能」です。
- ファイル保存は、文字通り「(シリアライザによって)データ構造から変換されたバイト列を、ファイルという実体に書き出すこと」です。
おおきな強みってなんなのでしょうか?
解釈の仕方としては、ファイル保存機能=シリアライザ(データ→バイト列変換)+(バイト列から)ファイルへの書出 とも言えます。シリアライザ部のみをライブラリ化することで、例えばネットワーク送信にも利用できる汎用部品として扱えるようになります。
投稿2020/07/06 07:25
編集2020/07/06 07:38総合スコア6191
0
シリアライザを調べてもファイル保存と変わらないと思ってしまいます。
はい。ファイルへ入出力する際は、(メモリイメージをそのまま読み書きするような荒業を使うのでなければ)何かしらの変換を行う必要がありますが、その変換を行うのがシリアライザです。
つまり、自分で書いたものも、形は違えどシリアライズです。
投稿2020/07/06 03:35
総合スコア146063
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
真面目な回答はすでに書かれているので、ゆるい回答をしてみます。
むかしのゲーム等で、中断するときにパスワードを手で記録していた時代がありました。
これを例にするとわかりやすいかなと。
シリアライズ
ゲームのいろいろなデータを(この場合は人間が)記録可能なパスワード(文字の羅列)にする。
デシリアライズ
人間が入力したパスワードからデータを復元する
兎にも角にも、内部のデータを何らかの形式で表現するのがシリアライズ・デシリアライズです。
質問者さんの、ファイルのread writeで代用できるのでは?というのは、
ファイルに保存するために 内部の状態をファイルに書き込める形にする というコードを
書くことになると思うのですが、これこそまさにシリアライズです。
(ファイルに変数の中身をこういう順番で並べる。とかやりますよね)
投稿2020/07/05 15:00
総合スコア2027
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/06 04:50
0
シリアライズ(serialize)を直訳すれば「直列化」ということになります。メモリにあるデータは、ランダムアクセスできるので、並列に並んでいるイメージがあります。これをファイルのセーブしたり、どこかに送信したりするには、順番に、つまり直列に並べてやらなければなりません。これがシリアライズです。したがって、シリアライズとはデータフォーマットの変換の一種ということになります。
一方、writeは、データをメモリから別の媒体(例えばファイルや他のコンピュータ)へコピーすることです。readは、別の媒体からメモリにコピーすることです。
つまりシリアライザとwriteは、注目していることが異なる、全く別の概念です。
例えば
C
1int data; 2data = /*何かの計算*/; 3write(fd, &data, sizeof(data));
というコードでも、概念的にはメモリ上のint
データをバイト列に読み替えるというシリアライズをしていることになります。この場合は、シリアライズの前後でメモリの内容は全く同一なので、わざわざコードを書く必要がないだけです。
また、このような素朴なシリアライズは、いつも、うまくいくわけではありません。
C
1struct person { 2 char * name; 3 int age; 4};
のようなデータを保存するとき、単に構造体を丸ごと保存しても意味がありません。別の場所にあるname
を保存してから、構造体内のage
を保存しなければなりません。これも、まさにシリアライズですし、struct person
を引数にとりファイルに保存する関数を作れば、シリアライザと呼んでかまわないでしょう。
自作のシリアライザを作るか、出来合いのシリアライザを利用するかは、プログラムを要件に基づいて決めるべきことです。
投稿2020/07/06 19:38
総合スコア430
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
シリアライザ、デシリアライザというものが
C++では使った事はありませんが、、、
シリアライザは、あるデータ(構造体、バイナリ等)を一定の規則でシリアル(大抵は、テキスト形式?)化するもので、デシリアライザは、それを復元する。
--> ちょっと訂正。構造体等の内部表現データをシリアル伝送可能な形式(例えば、バイト列)に変換する事。
(Wikipediaに項目が見つからなかった。ちょっと意外) SHOMIさんより、シリアライズとの事。(調べ方が悪かったか) プログラム用語みたいですね。
そのまま、ファイルに保存される事もありますが、元々は伝送路(通信)の話ではなかったでょうか? (ちょっと自信無い)
通信の場合、通信制御コードと実際のデータを区別する必要があるため、シリアライズし、通信制御コードと区別できるようにします。 これは、単なるテキスト化/符号化でした。
ファイルへの保存は、そのまま、ファイルへの保存。バイナリなら、バイナリのまま、保存ですね。結果として同じ場合もありますが、一般的には、形式が違う。 シリアライザでシリアル化したものをファイルに保存が一体化している場合がある。(と言うより、そちらが多い?)
実際のプログラムとしては、シリアライズして保存する必要は無く、内部データをそのまま、バイナリで保存しても良いですが、保守性/流通性などを考慮し、シリアライズする事があります。
質問文にある json
形式で保存すれば、テキスト形式で保存されるので、エディタ等での編集も可能となります。(バイナリ形式だと、一般には困難)
自分で、テキスト化するコードを書いても良いですが、この手のライブラリを使うのが便利です。
投稿2020/07/05 12:07
編集2020/07/05 13:10総合スコア6385
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/05 12:26
2020/07/06 03:25
2020/07/06 22:53
0
- シリアライズ
対象とするクラスの変数やプロパティの値をバイナリ、あるいはテキストに展開する
- デシリアライズ
バイナリ、あるいはテキストから、クラスの変数やプロパティを設定する
まあ、そりゃファイル保存と組み合わせることが多いかと思いますが、まったくべつもんですよ
投稿2020/07/05 08:00
総合スコア88051
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/06 13:43
2020/07/06 16:58
退会済みユーザー
2020/07/06 23:15 編集
2020/07/08 15:00
2020/07/08 15:03