我很好奇游戏开发人员提出了哪些解决方案来序列化他们为游戏处理的不同类型的数据。你们是否使用某些整体式GameObject层次结构,其中包含用于派生类型的序列化接口,使用某种基于RTTI的自定义解决方案,对某些类执行显式流序列化,还是使用某些开源解决方案(boost :: serialization,s11n,等等)。
我很好奇游戏开发人员提出了哪些解决方案来序列化他们为游戏处理的不同类型的数据。你们是否使用某些整体式GameObject层次结构,其中包含用于派生类型的序列化接口,使用某种基于RTTI的自定义解决方案,对某些类执行显式流序列化,还是使用某些开源解决方案(boost :: serialization,s11n,等等)。
Answers:
Google的协议缓冲区可能是序列化c ++对象的一种很好的方法。作为序列化过程的一部分,您可能必须制作一些中间对象,但它也可以在许多平台和语言中使用。
我们在游戏中只使用boost.serilization,它很容易使用并且非常快,但是我认为这对savegame很有用。如果您尝试创建字符,我建议您使用一些基于XML或JSON的东西,因为即使您没有编辑器,它们也易于阅读和编辑。
我宁愿使用JSON进行序列化。解析起来非常简单,并且有免费的库,例如http://jsoncpp.sourceforge.net/ 。Tinyxml还可以很好地用于xml序列化和反序列化。http://www.grinninglizard.com/tinyxml/ 最终,我不想花比序列化更多的时间。
Google FlatBuffers是针对C ++的高效跨平台序列化库,支持Java和Go。它是由Google创建的,专门用于游戏开发和其他对性能至关重要的应用程序。
根据Apache许可证v2,它可以作为开源使用。
消息包也是一个很好的选择!(http://msgpack.org)
XDS正是为此目的而设计的,它为您提供了XML在开发过程中的好处以及在分发时使用紧凑的二进制表示的好处。
如果您使用的是Linux平台,则可以直接使用json.h
库进行序列化。这是我遇到的示例代码。资料来源:Json序列化器
//============================================================================
// 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文件集合中创建一个场景,无论如何我都可以引用它。