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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C++

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

Q&A

解決済

7回答

1912閲覧

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

apa

総合スコア68

C++

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

0グッド

0クリップ

投稿2020/07/05 07:49

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

#include <cereal/cereal.hpp>
#include <cereal/archives/json.hpp>
シリアライザはいろいろなものがありますが、自分は上記にヘッダーを使いました

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

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

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

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

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

guest

回答7

0

ベストアンサー

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

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

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

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

投稿2020/07/06 07:25

編集2020/07/06 07:38
yohhoy

総合スコア6189

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

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

apa

2020/07/06 13:43

なるほど ネットワークゲームにおいてデータの保存に使えるのがシリアライザデシリアライズで 通信を使わないゲームであれば、バイナリデータを使おうがシリアライザを使おうが あんまりかわらないということですね?
magf

2020/07/06 16:58

(横から失礼します) いいえ。ネットワークかどうかは関係ありません。 ファイルに書き出すときを例に挙げてみます。 ファイルに書き出すときは、もしシリアライザを使わない時は自分でデータの構造を考える必要があります。 例えば、a,b,cというデータをファイルに書き出す時、どのように書き出すか考えますよね。"a=10,b=10,c=20"みたいな形式にしますか。"10,10,20"みたいにしますか。それとも"\x0a\x0a\x14"のようにバイナリデータにしますか。 シリアライザを使えば、こういう、「どのような形式で書き出すか?」というのを考える必要がなくなります。何も考えなくても、データ↔ファイルやデータ↔バイト列の変換ができます。
Kenji.Noguchi

2020/07/06 23:15 編集

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

2020/07/08 15:00

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

2020/07/08 15:03

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

0

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

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

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

投稿2020/07/06 03:35

maisumakun

総合スコア145121

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

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

0

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

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

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

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

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

投稿2020/07/05 15:00

YakumoSaki

総合スコア2027

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

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

apa

2020/07/06 03:21

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

2020/07/06 04:50

変数 A = 100, B = "aaa" というデータをファイルに書こうとするとき、CSV形式で出力することを考えます。 `100,aaa` となりますよね。 変数の内容を何らかの形式で表現することがシリアライズです。 Read write は、シリアライズした結果をどうするか。という後処理なので無関係です。 実務的には、シリアライズしたデータはファイルに保存するか、DBに書くか、ネットワークに送信するかくらい しか考えられないので、かなり関連した事項ではあると思います。
guest

0

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

投稿2020/07/08 15:04

apa

総合スコア68

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

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

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

Bearded-Ockham

総合スコア430

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

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

0

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

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

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

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

投稿2020/07/05 12:07

編集2020/07/05 13:10
pepperleaf

総合スコア6383

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

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

apa

2020/07/06 03:25

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

2020/07/06 22:53

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

0

  • シリアライズ

対象とするクラスの変数やプロパティの値をバイナリ、あるいはテキストに展開する

  • デシリアライズ

バイナリ、あるいはテキストから、クラスの変数やプロパティを設定する

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

投稿2020/07/05 08:00

y_waiwai

総合スコア87719

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

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

apa

2020/07/05 11:36

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問