私は、ゲーム開発者がゲーム用に扱うさまざまなタイプのデータをシリアル化するためにどのようなソリューションを考え出したのか興味があります。派生型のシリアル化インターフェイスを収容するモノリシックなGameObject階層を使用する、カスタムRTTIベースのカスタムソリューションを使用する、特定のクラスの明示的なストリームシリアル化を実行する、またはいくつかのオープンソースソリューションを使用する(boost :: serialization、s11n、等)。
私は、ゲーム開発者がゲーム用に扱うさまざまなタイプのデータをシリアル化するためにどのようなソリューションを考え出したのか興味があります。派生型のシリアル化インターフェイスを収容するモノリシックなGameObject階層を使用する、カスタムRTTIベースのカスタムソリューションを使用する、特定のクラスの明示的なストリームシリアル化を実行する、またはいくつかのオープンソースソリューションを使用する(boost :: serialization、s11n、等)。
回答:
Googleのプロトコルバッファは、C ++オブジェクトをシリアル化するための非常に優れたアプローチです。シリアル化プロセスの一部として、いくつかの中間オブジェクトを作成する必要がありますが、多くのプラットフォームと言語で機能します。
私たちのゲームでは、単純にboost.serilizationを使用します。これは使いやすく、非常に高速ですが、savegamesに役立つと思うのです。文字を作成しようとする場合、XMLに似たものまたはJSONベースのものをお勧めします。エディターがなくても読みやすく、編集が容易だからです。
シリアル化にはJSONが好きです。解析するのは非常に簡単で、http://jsoncpp.sourceforge.net/のような無料のライブラリが利用可能です 。C++でboostやRTTIのファンになったことはありません。Tinyxmlは、XMLのシリアル化と逆シリアル化にも適しています。http://www.grinninglizard.com/tinyxml/ 最終的には、シリアル化に必要な時間よりも多くの時間を費やす必要はありません。
Google FlatBuffersは、C ++用の効率的なクロスプラットフォームシリアル化ライブラリであり、JavaとGoをサポートしています。これは、ゲーム開発やその他のパフォーマンスが重要なアプリケーション向けにGoogleで作成されました。
Apacheライセンスv2の下でオープンソースとして利用できます。
メッセージパックも素晴らしい選択肢です!(http://msgpack.org)
XDSはこの目的のためだけに設計されており、開発中のXMLの利点と、配布時のコンパクトなバイナリ表現の利点を提供します。
Linuxプラットフォームを使用している場合はjson.h
、シリアル化にライブラリを直接使用できます。ここに私が出会ったサンプルコードがあります。ソース:Json Serializer
//============================================================================
// Name : JsonTest.cpp
// Author : Manis Kumar Khedawat
//============================================================================
#include <iostream>
#include <json/json.h>
using namespace std;
struct objStruct{
string str;
int n1;
int n2;
};
typedef objStruct obj;
void serializeToJson(json_object *jObj,obj* pObj)
{
/*
string str;
int n1;
int n2;
*/
// Create json object for every member in struct Obj.
json_object *jstr = json_object_new_string (pObj->str.c_str());
json_object *jn1 =json_object_new_int(pObj->n1);
json_object *jn2 =json_object_new_int(pObj->n2);
// Add all above created object into jObj
json_object_object_add(jObj,"str",jstr);
json_object_object_add(jObj,"n1",jn1);
json_object_object_add(jObj,"n2",jn2);
// pObj is Serialzed into jObj
}
void deSerializeToJson(json_object *jObj,obj* pObj)
{
/*
string str;
int n1;
int n2;
*/
// Get every member as different json obj from jObj
json_object *jstr = json_object_object_get (jObj,"str");
json_object *jn1 =json_object_object_get(jObj,"n1");
json_object *jn2 =json_object_object_get(jObj,"n2");
pObj->str=json_object_get_string(jstr);
pObj->n1=json_object_get_int(jn1);
pObj->n2=json_object_get_int(jn2);
// jObj is DeSerialzed into pObj
}
int main() {
// Lets Create an Object which we will serialze into Json
obj obj1;
obj1.n1=3;
obj1.n2=6;
obj1.str="This is String";
// Create a json Object
json_object* jObj=json_object_new_object();
// To serialize into Json Object
// Please Keep in mind , we are passing address of object (pointer) & not object
serializeToJson(jObj,&obj1);
obj obj2;
// To serialize into Json Object
// Please Keep in mind , we are passing address of object (pointer) & not object
deSerializeToJson(jObj,&obj2);
cout<<"String str == "<<obj2.str<<endl;
cout<<"n1 & n2 : "<<obj2.n1<<" "<<obj2.n2<<endl;
return 0;
}
jsonCppとProtocolバッファの両方が適切なオプションです。私の知る限り、両方ともすぐに使用できるツリー構造をシリアル化できます(間違っている場合は修正してください)。boost :: serializationは任意のグラフを処理できますが、jsonのような素敵なテキスト形式はありません(xml形式があると思います)
個人的には、Dojoが取ったJSONシリアル化のアプローチは最高のhttp://docs.dojocampus.org/dojox/json/refであると思い
ます
私はjsoncppを使用してc ++で独自のバージョンを作成しましたが、これも型指定されたオブジェクトをデシリアライズします(すべての型に大きなファクトリーがあります)。これにより、とにかく参照できるjsonファイルのコレクションからシーンを作成できます。