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

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

ただいまの
回答率

88.91%

シリアライザとファイル保存の違い

解決済

回答 7

投稿

  • 評価
  • クリップ 0
  • VIEW 517

apa

score 15

C++においてシリアライザ、デシリアライザというものがあると思います。
シリアライザはいいと聞きますが、
シリアライザを調べてもファイル保存と変わらないと思ってしまいます。
実際に実装もしてみましたが、少しまとまってきれいになったくらいで、
ファイル保存でもできると思ってしまいます。
おおきな強みってなんなのでしょうか?

include <cereal/cereal.hpp>

include <cereal/archives/json.hpp>

シリアライザはいろいろなものがありますが、自分は上記にヘッダーを使いました

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 7

checkベストアンサー

+3

「シリアライザ」と「ファイル保存」では、概念のレイヤが異なる≒比較する土俵が違うと言えばよいでしょうか?

  • シリアライザ(Serializer)は、「プログラム上で扱う何らかのデータ構造から、ファイル保存やネットワーク送信を可能とするために、バイト列へと変換する機能」です。
  • ファイル保存は、文字通り「(シリアライザによって)データ構造から変換されたバイト列を、ファイルという実体に書き出すこと」です。

おおきな強みってなんなのでしょうか?

解釈の仕方としては、ファイル保存機能=シリアライザ(データ→バイト列変換)+(バイト列から)ファイルへの書出 とも言えます。シリアライザ部のみをライブラリ化することで、例えばネットワーク送信にも利用できる汎用部品として扱えるようになります。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/07 08:12 編集

    @apa バイナリとシリアライザが対義と理解されているようですが、シリアライズした結果はバイナリのこともあるしテキストのこともあります。例えばAvroならバイト列でしょうしJSONならテキストです。もっと言えばJSONのテキストだって広義にはUTF-8でエンコードされたバイト列です。どのような書式にするかはシリアライザしだいです。一旦シリアライズされたらネットワークで送っても良いし、ファイルに書き込んでも言い訳です。書式に従って読み込めば、元のオブジェクトを復元できますね。

    キャンセル

  • 2020/07/09 00:00

    あーなるほどだいぶわかった気がします。
    シリアライザ自体は保存する機能があるわけじゃなくて
    あくまでまとめてくれるってことなんですね!

    キャンセル

  • 2020/07/09 00:03

    ただ基本的にfileに書き込みするときのは
    シリアライザされているのであまり使い道はなさそうですね。
    (バイトデータで扱いたいときってネットワークにおくることぐらいですか?)

    キャンセル

+2

シリアライザを調べてもファイル保存と変わらないと思ってしまいます。

はい。ファイルへ入出力する際は、(メモリイメージをそのまま読み書きするような荒業を使うのでなければ)何かしらの変換を行う必要がありますが、その変換を行うのがシリアライザです。

つまり、自分で書いたものも、形は違えどシリアライズです

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

  • シリアライズ
    対象とするクラスの変数やプロパティの値をバイナリ、あるいはテキストに展開する
  • デシリアライズ
    バイナリ、あるいはテキストから、クラスの変数やプロパティを設定する

まあ、そりゃファイル保存と組み合わせることが多いかと思いますが、まったくべつもんですよ

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/05 20:36

    返信ありがとうございます。
    ん?自分の理解力がないせいなのですが、
    今y_waiwaiさんからの内容ですと
    シリアライザとデシリアライズはファイルのread writeでも代用できそうに感じますが
    どうでしょうか?

    キャンセル

0

シリアライザ、デシリアライザというものが

C++では使った事はありませんが、、、
シリアライザは、あるデータ(構造体、バイナリ等)を一定の規則でシリアル(大抵は、テキスト形式?)化するもので、デシリアライザは、それを復元する。
--> ちょっと訂正。構造体等の内部表現データをシリアル伝送可能な形式(例えば、バイト列)に変換する事。
(Wikipediaに項目が見つからなかった。ちょっと意外) SHOMIさんより、シリアライズとの事。(調べ方が悪かったか) プログラム用語みたいですね。
そのまま、ファイルに保存される事もありますが、元々は伝送路(通信)の話ではなかったでょうか? (ちょっと自信無い)
通信の場合、通信制御コードと実際のデータを区別する必要があるため、シリアライズし、通信制御コードと区別できるようにします。 これは、単なるテキスト化/符号化でした。

ファイルへの保存は、そのまま、ファイルへの保存。バイナリなら、バイナリのまま、保存ですね。結果として同じ場合もありますが、一般的には、形式が違う。 シリアライザでシリアル化したものをファイルに保存が一体化している場合がある。(と言うより、そちらが多い?)

実際のプログラムとしては、シリアライズして保存する必要は無く、内部データをそのまま、バイナリで保存しても良いですが、保守性/流通性などを考慮し、シリアライズする事があります。
質問文にある json形式で保存すれば、テキスト形式で保存されるので、エディタ等での編集も可能となります。(バイナリ形式だと、一般には困難)
自分で、テキスト化するコードを書いても良いですが、この手のライブラリを使うのが便利です。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/05 21:26

    >Wikipediaに項目が見つからなかった
    シリアライズで載っています。
    https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%A9%E3%82%A4%E3%82%BA#%E7%9B%B4%E5%88%97%E5%8C%96

    キャンセル

  • 2020/07/06 12:25

    シリアライザは規則がわかれば解読できて
    バイナリは機械に任せないと解読できない
    テキストは一般ユーザーでも解読できる
    こういうことでしょうか?

    キャンセル

  • 2020/07/07 07:53

    解読できるかどうかが、シリアライザの意味ではありません。そういう意味では書き方が間違っていたでしょうか。バイナリのままでは、扱いづらいので、多くの場合、テキスト化される事が多いようです。

    キャンセル

0

真面目な回答はすでに書かれているので、ゆるい回答をしてみます。
むかしのゲーム等で、中断するときにパスワードを手で記録していた時代がありました。
これを例にするとわかりやすいかなと。

シリアライズ
ゲームのいろいろなデータを(この場合は人間が)記録可能なパスワード(文字の羅列)にする。

デシリアライズ
人間が入力したパスワードからデータを復元する

兎にも角にも、内部のデータを何らかの形式で表現するのがシリアライズ・デシリアライズです。

質問者さんの、ファイルのread writeで代用できるのでは?というのは、
ファイルに保存するために 内部の状態をファイルに書き込める形にする というコードを
書くことになると思うのですが、これこそまさにシリアライズです。
(ファイルに変数の中身をこういう順番で並べる。とかやりますよね)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/06 12:21

    返信ありがとうございます。
    すいません語学力がなく確認したいのですが、
    今の回答ですと シリアライザ,デシリアライズという大きいくくりの中に
    Read writeがあるということなのでしょうか?

    キャンセル

  • 2020/07/06 13:50

    変数 A = 100, B = "aaa" というデータをファイルに書こうとするとき、CSV形式で出力することを考えます。
    `100,aaa` となりますよね。 変数の内容を何らかの形式で表現することがシリアライズです。

    Read write は、シリアライズした結果をどうするか。という後処理なので無関係です。

    実務的には、シリアライズしたデータはファイルに保存するか、DBに書くか、ネットワークに送信するかくらい
    しか考えられないので、かなり関連した事項ではあると思います。

    キャンセル

0

シリアライズ(serialize)を直訳すれば「直列化」ということになります。メモリにあるデータは、ランダムアクセスできるので、並列に並んでいるイメージがあります。これをファイルのセーブしたり、どこかに送信したりするには、順番に、つまり直列に並べてやらなければなりません。これがシリアライズです。したがって、シリアライズとはデータフォーマットの変換の一種ということになります。

一方、writeは、データをメモリから別の媒体(例えばファイルや他のコンピュータ)へコピーすることです。readは、別の媒体からメモリにコピーすることです。

つまりシリアライザとwriteは、注目していることが異なる、全く別の概念です。

例えば

int data;
data = /*何かの計算*/;
write(fd, &data, sizeof(data));


というコードでも、概念的にはメモリ上のintデータをバイト列に読み替えるというシリアライズをしていることになります。この場合は、シリアライズの前後でメモリの内容は全く同一なので、わざわざコードを書く必要がないだけです。

また、このような素朴なシリアライズは、いつも、うまくいくわけではありません。

struct person {
    char * name;
    int age;
};


のようなデータを保存するとき、単に構造体を丸ごと保存しても意味がありません。別の場所にあるnameを保存してから、構造体内のageを保存しなければなりません。これも、まさにシリアライズですし、struct personを引数にとりファイルに保存する関数を作れば、シリアライザと呼んでかまわないでしょう。

自作のシリアライザを作るか、出来合いのシリアライザを利用するかは、プログラムを要件に基づいて決めるべきことです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

回答してくださった方
わざわざ自分のために時間さいていただきありがとうございました

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る