C ++でのシリアル化に適したソリューションは何ですか?[閉まっている]


18

私は、ゲーム開発者がゲーム用に扱うさまざまなタイプのデータをシリアル化するためにどのようなソリューションを考え出したのか興味があります。派生型のシリアル化インターフェイスを収容するモノリシックなGameObject階層を使用する、カスタムRTTIベースのカスタムソリューションを使用する、特定のクラスの明示的なストリームシリアル化を実行する、またはいくつかのオープンソースソリューションを使用する(boost :: serialization、s11n、等)。


1
ゲーム開発プログラミングでのシリアル化は重要なトピックだと思いますが、この質問は好きではありません。何しようとしていますか?解決しようとしている具体的な問題は何ですか?それに代わって、私はそれをコミュニティwikiに変換し、それがよりディスカッション形式になるようにしました。
テトラッド

これに何らかのフォーマットを適用すると良いと思います(バージョン管理の質問です)。
ジェシードーシー

回答:


9

Googleのプロトコルバッファは、C ++オブジェクトをシリアル化するための非常に優れたアプローチです。シリアル化プロセスの一部として、いくつかの中間オブジェクトを作成する必要がありますが、多くのプラットフォームと言語で機能します。


1
私はそれを使用していますが、ビルドシステムでコード生成を自動化できれば簡単です。本当に優れた利点は、使用しているプラ​​ットフォームに関係なく、リモートMachniesでデータを転送できることです。また、生成されるオブジェクトが大きくならないように最適化されています。
クライム

10

私たちのゲームでは、単純にboost.serilizationを使用します。これは使いやすく、非常に高速ですが、savegamesに役立つと思うのです。文字を作成しようとする場合、XMLに似たものまたはJSONベースのものをお勧めします。エディターがなくても読みやすく、編集が容易だからです。


boost :: serializationがクライアント/サーバー通信にも使用されるのを見てきました。ただし、知る限りではストリームベースであるため、バージョントレランスは正確ではありません。それはクライアント/サーバー通信の取り引きを妨げるものではないかもしれませんが、保存されたゲームに使用する場合、ゲームのデータ構造を変更すると、古い保存されたゲームの読み込みが仮想的に不可能になります(古いオブジェクトバージョンの読み込みのサポートは本当に面倒になります)。
マイクストロベル

2
@MikeStrobel私は最近、いくつかのシリアル化キットとjsonキットをレビューしていましたが、このコメントに出会いました。boost :: serializationはバージョン管理を明示的にサポートしています。シリアル化呼び出しはバージョン番号を受け取ることができます。その後、基本的な分岐ロジック(if(version> 1.0)...)を実装するのはユーザー次第です。全体的にかなり堅牢なようです。
M2tM

残念ながら、カスタムのアロケーター/削除機能をサポートしていないようです。
JamesAMD

1
ブーストシリアル化からシリアルに移植しました。ポートは非常にスムーズでした。それは魅力のように働いた。Cerealはxml、json、binary、portable binaryをサポートしています。私がシリアルに移植した理由は最後の理由でした。クライアント(現在はMac、まもなくiOSとAndroid)が接続するサーバーを実行するため、ポータブルバイナリアーカイブが必要でした。ブーストシリアル化には非常に満足していましたが、前述のポータブルバイナリシリアル化など、シリアルの機能のいくつかはより優れた方法でそれをさらに一歩進めると思います。言語相互運用プロトコルバッファなどの場合はより優れています。
ゲルマンディアゴ

ドキュメントごとにboost.serializationはスレッドセーフではありません。同様のAPIを使用するシリアルもありません
ハイエンジェル

3

シリアル化にはJSONが好きです。解析するのは非常に簡単で、http://jsoncpp.sourceforge.net/のような無料のライブラリが利用可能です 。C++でboostやRTTIのファンになったことはありません。Tinyxmlは、XMLのシリアル化と逆シリアル化にも適しています。http://www.grinninglizard.com/tinyxml/ 最終的には、シリアル化に必要な時間よりも多くの時間を費やす必要はありません。


2

Google FlatBuffersは、C ++用の効率的なクロスプラットフォームシリアル化ライブラリであり、JavaとGoをサポートしています。これは、ゲーム開発やその他のパフォーマンスが重要なアプリケーション向けにGoogleで作成されました。

Apacheライセンスv2の下でオープンソースとして利用できます。



1

XDSはこの目的のためだけに設計されており、開発中のXMLの利点と、配布時のコンパクトなバイナリ表現の利点を提供します。


XDSがGoogleプロトコルバッファーと何が違うのか本当にわかりませんか?XDSが最初であったことを除いて、同じ目的を果たしているようです。
-jacmoe

あなたは確かにXDSではなくXSDを意味しますか?codesynthesis.com/products/xsdリストを完成させるためにそれに関する答えを投稿したかった。
v.oddou 14年

1

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;
}

0

jsonCppとProtocolバッファの両方が適切なオプションです。私の知る限り、両方ともすぐに使用できるツリー構造をシリアル化できます(間違っている場合は修正してください)。boost :: serializationは任意のグラフを処理できますが、jsonのような素敵なテキスト形式はありません(xml形式があると思います)

個人的には、Dojoが取ったJSONシリアル化のアプローチは最高のhttp://docs.dojocampus.org/dojox/json/refであると思い
ます

私はjsoncppを使用してc ++で独自のバージョンを作成しましたが、これも型指定されたオブジェクトをデシリアライズします(すべての型に大きなファクトリーがあります)。これにより、とにかく参照できるjsonファイルのコレクションからシーンを作成できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.