いserializeオブジェクトのC++?
-
22-08-2019 - |
質問
私は小さな階層オブジェクトでserialize、複製、公衆送信ソケット接続します。いもserializeのオブジェクトを直列化復元することはもちろんどのタイプです。やないということでC++(あJava)?
あるC++を直列化オンラインコードサンプルやチュートリアル?
編集: かにはうってつけの方法に変換するオブジェクトをバイト配列に、その後にオブジェクトです。取扱いできますのソケット伝送します。
解決
話を直列化の 向直列化API に興味を持っていました。などを伝達するための直列化されたデータをネット上のも、今までのいずれかを使用バークレーのソケットの asio図書館.
編集:
したい場合はserialize御オブジェクトをバイト配列を使用できますの向シリアライザは以下のように撮影されたものからのチュートリアルサイト):
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
class gps_position
{
private:
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & degrees;
ar & minutes;
ar & seconds;
}
int degrees;
int minutes;
float seconds;
public:
gps_position(){};
gps_position(int d, int m, float s) :
degrees(d), minutes(m), seconds(s)
{}
};
実際の直列化は、そのかす:
#include <fstream>
std::ofstream ofs("filename.dat", std::ios::binary);
// create class instance
const gps_position g(35, 59, 24.567f);
// save data to archive
{
boost::archive::binary_oarchive oa(ofs);
// write class instance to archive
oa << g;
// archive and stream closed when destructors are called
}
直列化復元動作に類似する。
またメカニズムだけを扱う直列化のポインター(複雑データ構造のような木など問題ない)に由来する授業を選択することができますバイナリおよびテキスト直列化します。ものすべてのSTL容器に対応してセット。
他のヒント
場合に、簡単な種類できないな
object o;
socket.write(&o, sizeof(o));
大丈夫として、トランは第一案は、他の会員のチームで頑張りたいと思いその他の部品です。
では、遅かれ早かれ 通常より早く, このままですごく痛いです。
りませ課題:
- 仮想のポインタのテーブルが崩れます。
- ポインタ(データ/メンバー/機能)が壊れる可能性があります。
- の違いパディング/アライメントが異なる。
- ビッグ/リトルエンディアンのバイト順序問題です。
- 変動の実施float/double.
(マンハッタンを知る必要がありま封入し、受信側になります。)
を向上させることができ、この開発によるご自身の整列化/unmarshalling方法されるのではありません。(理想を仮想することが可能ですので、を有していることを特徴とするサブクラス) いくつかの簡単なマクロましく異なるタイプで短期間に大きな/リトルエンディアンニュートラルです。
そのような面倒な仕事であり、より簡単に扱え ブの直列化図書館.
直列化手段曲げオブジェクトにバイナリデータです。が直列化復元手段を再現からオブジェクトのデータです。
が直列化さい押してバイトへ uint8_t
ベクトルとなっています。時unserializingいただいた皆さまには、バイトから uint8_t
ベクトルとなっています。
あのパターンでの採用が直列化さん。
各直列化可能クラスのすべて serialize(std::vector<uint8_t> &binaryData)
または類似のsignatured数を書のバイナリ表現へのベクトルとなっています。この機能がこのベクターでも、会員の直列化さの機能をできるように書けられている。
以降、データ表現である必要はありませんの異なる述べた。必要なものを見出し、その制度を表記する方法についてのデータです。
まずは基礎から:
直列化さ整数データ
だけのバイトなエンディアンです。使用varint表現場サイズ。
直列化の少ないエンディアンの順:
data.push_back(integer32 & 0xFF);
data.push_back((integer32 >> 8) & 0xFF);
data.push_back((integer32 >> 16) & 0xFF);
data.push_back((integer32 >> 24) & 0xFF);
直列化復元から少しエンディアンの順:
integer32 = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24);
直列化さ浮動小数点データ
私が知る限りでは、IEEE754を独占。わからないのが主流で建築うに使うために浮かぶ.るということだけである必要はありませんのバイト順です。アーキテクチャもあ利用に少しエンディアン、その他の使用ビッグエンディアンバイト順です。このとき注意が必要するためのお声をバイトをしました。もう一つの違いときの取り扱いdenormalおよび無限大で、NAN値です。などを避けるこれらの値にすべきでOKです。
直列化:
uint8_t mem[8];
memcpy(mem, doubleValue, 8);
data.push_back(mem[0]);
data.push_back(mem[1]);
...
直列化復元はでき戻してしまった。心のバイト順の建築まで見どころたっぷり。
直列化さの文字列
最初にご同意いただく必要があり、エンコーディングです。UTF-8が一般的です。そして店舗として長さの接頭辞が付方法:最初のオプションが文字列の長さ方法によっては、前述のとおり、一時的に保存してから文字列のバイト-バイ-バイトになります。
直列化さarrays.
そのと同じ文字列です。まずserializeの整数を表すサイズの配列をserialize各オブジェクトです。
直列化さ全体物
先ほど述べたようになって serialize
方法と追加コンテンツへのベクトルとなっています。にunserializeオブジェクトですべてを取るコンストラクタでのバイトストリームです。ができる istream
が最も簡単なケースではできるだけ参照 uint8_t
ポインタです。コンストラクタを読み込みバイトをしたいからストリームを定め、さまざまな分野のオブジェクトです。システムがありserializeの分野のオブジェクトフィールド順できるため、パスのストリームのフィールドのコンストラクタで初期化リストとしての直列化復元、順を追ってご説明します。
直列化さのオブジェクトグラフ
最初に必要なものを確認してくださいこれらのオブジェクトが実際に何かしたいserialize.いserializeした場合のインスタンスのこれらのオブジェクトの現在の先になります。
また必要なものserializeそのオブジェクトを指摘によるポインタです。この問題のポインタも有効なだけのプログラムを使用します。はできませんserializeポインタで、使用を中止します。代わりにオブジェクトの作成プールがあります。このオブジェクトのプールは基本的には動的な配列を含む"ボックス".これらの箱を参照す。ゼロ以外の参照カウントを示すライブのオブジェクトゼロを示す空のスロットに実装されていません。そのスマートポインタのようにshared_ptrない店舗のポインタをオブジェクトが、指数の配列になります。おもに同意いただくことが必要するための指標としては、nullポインタは、例えば.-1になります。
基本的には何ができたのかここでのポインタ配列。今が直列化さきserializeこの配列インデックスとなります。必要な心配をせずにオブジェクトのメモリーに先制です。かに関しては、必ず確認しましょう同じオブジェクトをプールす。
いる必要がありまserializeのオブジェクトプールがあります。ですか。全てのserializeオブジェクトのグラフをしない直列化さだけのオブジェクトは、直列化さ、全体のシステム。これは直列化システムのなかにシステム。それらのオブジェクトな心配り、システムだけではないが必要serialize配列の指標となります。すべてのシステムシリアルーチンとorchestratesの直列化のシステムとの関係オブジェクトのプールやserialize全員について記入してください。
のすべての配列の物体が直列化復元を再生に望ましいオブジェクトのグラフで表示します。
直列化さの関数ポインタ
保管しないでくださいポインタをオブジェクトです。て静的な配列を含むポインタのこれらの機能のインデックスのオブジェクトです。
両プログラムがこのテーブルに集約されthemshelves、指すべきます。
直列化さ結晶の種類
またどうしたらよいかということですポインタの直列化可能種類のものを使用できる配列の指数の代わりに、多型んでいくことはできないので作業が必要となるため、ポインタ.
制作に必要なこの種のタグとの組合
バージョン管理
上のすべての。しょうたいのバージョンが異なっていると、ソフトウェアの互換.
この場合、各オブジェクトはバージョン番号の先頭の直列化を示す。
ロードオブジェクトのその他の側に最新情報をメールにてお届けし物にも対応できるの表明では、古いものお取扱いできない、新しいようにすべき例外をスローします。
毎回何かが変わるべきバンプのバージョン番号を示します。
で包むこと、直列化は手間のかかる場合があります。が、幸いなことになserializeべてのプログラムの中で最も多くのプロトコルのメッセージが直列化されることの多い平野の古い構造体.必要ありませんが、複雑なぎっては、前述のとおりいたしました。