私は最近、アルゴリズムとデータ構造、TCP/IPソケットプログラミング、およびメモリを使用したプログラミングに関する3つの別々の本を読みました。メモリに関する本では、データ構造をディスクに保存したり、ネットワークを介して送信したりする目的でデータ構造をシリアル化するトピックについて簡単に説明しました。他の2冊の本が連載についてまったく触れていないのはなぜだろう。
Web /ブック検索が失敗した後、Cでのデータ構造のシリアル化に関する優れたブック/ペーパー/チュートリアルがどこにあるのか疑問に思いますか?どこで、どのようにしてそれを学びましたか?
Cは構造のシリアル化をネイティブでサポートしていないので、自分で行う必要があります。
一次近似は、(他の返信で述べられているように)プリミティブ型に対して定義し、より大きな構造に再帰的に適用することです。
ただし、単純な概念を超えて対処する必要がある多くの悪魔のような詳細があります。いくつか例を挙げると:
Googleが Protocol Buffers を使って行った作業を見てください。
次のような.protoファイルを記述します。
message Person {
required int32 id = 1;
required string name = 2;
optional string email = 3;
}
次に、プロトコルバッファコンパイラであるprotocを使用してコンパイルし、C++、Java、またはPythonでコードを生成します。
次に、C++を使用している場合は、次のようなコードを使用します。
Person person;
person.set_id(123);
person.set_name("Bob");
person.set_email("[email protected]");
fstream out("person.pb", ios::out | ios::binary | ios::trunc);
person.SerializeToOstream(&out);
out.close();
SerializeToOstream
メソッドを調べると、Googleがシリアル化コードを生成する方法を理解できます。はい、それはC++コードですが、それでもCコードにかなり近いはずです。
実行可能な速度、使いやすさ、および移植性の間のすべてのさまざまなトレードオフがあり、非常に多くの可能なバリエーションがあるため、おそらくそれはあなたの本では扱われませんでした。
たとえば、1と3はスペクトルの反対側の端であり、2はそれらの間で可能な小さな変動の数を示しています。
シリアライズせず、生のバイトをコピーするだけ
1とするが、パディング、配置、エンディアンを明示的に指定する
すべてをXMLやJSONなどのテキスト形式にシリアル化する
ああ、そして私は、既存の文書化されたプロトコルを実装することによって、このこと(上記のすべてに加えて、CORBA、ASN.1、およびProtocolBuffers)について学びました。
主な焦点が速度ではなく携帯性である場合、スペクトルの#3の終わりに向けたものがおそらくより適切です。 howについては、そもそもそれを構築しますが、それはほとんど反射についての問題です。
ウィキペディアの記事 Serialization はトピックをかなりうまくカバーしていますが、奇妙なことに言及していません ASN.1 これは広く嫌われていますが、効率的に説明するための非常によく定義されたよく知られた標準ですデータ直列化プロトコル。 ASNコンパイラは通常、記述されたデータ構造を正規の方法でエンコードおよびデコードするためのコード(Cコードなど)を生成します。
ところで、エンディアンの問題は、Rob Pikeが彼の記事 The Byte Order Fallacy でうまく示したように、Cで簡単に処理できますが、一部のCコンパイラは、常に最適なオブジェクトコードを常に生成するとは限りませんこの手法を使用します。