私が探しているのは、RakNetに組み込まれているシリアル化ライブラリ(現在のプロジェクトでは使用できません)に似ています。バイナリストリームをローカルでカスタム形式に保存/ロードし、ネットワーク経由で送信できるようにする必要があります。ネットワークの部分は解決されましたが、特に圧縮メソッドがないと非効率になるため、さまざまなタイプのデータをすべてバイナリにシリアル化するための独自のメソッドを作成したくありません。
これは、RakNetのビットストリームがどのように機能するかに似たいくつかの擬似コードです。これは私が探しているものに沿ったものです。
class Foo
{
public:
void Foo::save(BitStream& out)
{
out->write(m_someInt);
out->write(m_someBool);
m_someBar.save(out);
// Alternative syntax
out->write<int>(m_someInt);
// Also, you can define custom serialization for custom types so you can do this...
out->write<Bar>(m_someBar);
// Or this...
out->write(m_someBar);
}
void Foo::load(BitStream& in)
{
in->read(m_someInt);
in->read(m_someBool);
in->read(m_someBar);
}
private:
int m_someInt;
bool m_someBool;
Bar m_someBar;
};
このようなことを可能にする無料のC++ライブラリはありますか?基本的には、データをバイナリにパックし、シリアル化のために圧縮してから、データにフィードバックできるようにバイナリに解凍するものが必要です。
編集、詳細情報の追加:
残念ながら、GoogleProtocolBuffersもBoostSerializationも私のニーズには対応しません。どちらもオブジェクトメンバーをシリアル化することを期待しています。データをシリアル化する必要があります。たとえば、私がを持っていてstd::vector<Person>
、クラスPerson
にstd::string
for nameと他のデータが含まれているとしましょう。しかし、それらの名前をシリアル化および逆シリアル化するだけです。Google Protocol Buffersを使用すると、シリアル化のために全体としてPersonオブジェクトを提供することが期待されます。ただし、Boost Serializationを使用してこれを達成することはできますが、別のシナリオで全体が必要な場合はPerson
シリアル化するには、それを行う方法はありません。すべてをシリアル化するか、まったくシリアル化する必要がありません。基本的に、バイナリストリームを作成するにはかなりの柔軟性が必要ですが、適切と思われます。ストリームとの間のバイナリデータの読み取りと書き込み、およびストリームの圧縮/解凍を管理するのに役立つライブラリが必要です。