게임 개발자가 게임을 처리하는 다양한 유형의 데이터를 직렬화하기 위해 게임 개발자가 어떤 솔루션을 개발했는지 궁금합니다. 파생 된 유형에 대한 직렬화 인터페이스를 포함하는 모 놀리 식 GameObject 계층 구조를 사용하고, 일종의 사용자 정의 RTTI 기반 솔루션을 사용하거나, 특정 클래스에 대해 명시 적 스트림 직렬화를 수행하거나, 일부 오픈 소스 솔루션을 사용합니까 (boost :: serialization, s11n, 기타).
게임 개발자가 게임을 처리하는 다양한 유형의 데이터를 직렬화하기 위해 게임 개발자가 어떤 솔루션을 개발했는지 궁금합니다. 파생 된 유형에 대한 직렬화 인터페이스를 포함하는 모 놀리 식 GameObject 계층 구조를 사용하고, 일종의 사용자 정의 RTTI 기반 솔루션을 사용하거나, 특정 클래스에 대해 명시 적 스트림 직렬화를 수행하거나, 일부 오픈 소스 솔루션을 사용합니까 (boost :: serialization, s11n, 기타).
답변:
우리는 게임에서 단순히 boost.serilization 을 사용합니다. 사용하기 쉽고 매우 빠르지 만 제 생각에는 savegames에 유용합니다. 문자를 만들려고하면 편집기가 없어도 쉽게 읽고 편집 할 수 있기 때문에 XML'ish 또는 JSON 기반 항목을 사용하는 것이 좋습니다.
나는 직렬화를 위해 JSON을 좋아한다. 파싱하는 것은 매우 간단하며 http://jsoncpp.sourceforge.net/ 과 같은 무료 라이브러리가 있습니다. 저는 C ++에서 부스트 또는 RTTI의 팬이었던 적이 없습니다. Tinyxml은 XML 직렬화 및 역 직렬화에도 잘 작동합니다. http://www.grinninglizard.com/tinyxml/ 궁극적으로 나는 직렬화에 필요한 것보다 더 많은 시간을 보내고 싶지 않습니다.
Google FlatBuffers 는 Java 및 Go를 지원하는 C ++ 용 효율적인 크로스 플랫폼 직렬화 라이브러리입니다. 게임 개발 및 기타 성능이 중요한 응용 프로그램을 위해 특별히 Google에서 만들어졌습니다.
Apache 라이센스 v2에 따라 오픈 소스로 제공됩니다.
메시지 팩도 훌륭한 대안입니다! (http://msgpack.org)
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 및 프로토콜 버퍼 모두 좋은 옵션입니다. 내 지식으로는 둘 다 상자에서 직렬 트리 구조를 직렬화 할 수 있습니다 (잘못된 경우 수정하십시오). boost :: serialization은 임의의 그래프를 처리 할 수 있지만 json과 같은 멋진 텍스트 형식은 없습니다 (xml 형식이 있다고 생각합니다)
개인적으로 Dojo가 취한 json 직렬화 접근법이 최고라고 생각합니다.
http://docs.dojocampus.org/dojox/json/ref
jsoncpp를 사용하여 c ++로 자체 버전을 만들었습니다. 이는 유형이 지정된 객체를 직렬화 해제합니다 (모든 유형에 대해 일종의 큰 팩토리가 있습니다). 어쨌든 참조 할 수있는 json 파일 모음에서 장면을 만들 수 있습니다.