有什么好的C ++序列化解决方案?[关闭]


18

我很好奇游戏开发人员提出了哪些解决方案来序列化他们为游戏处理的不同类型的数据。你们是否使用某些整体式GameObject层次结构,其中包含用于派生类型的序列化接口,使用某种基于RTTI的自定义解决方案,对某些类执行显式流序列化,还是使用某些开源解决方案(boost :: serialization,s11n,等等)。


1
我认为游戏开发编程中的序列化是一个重要的话题,但是我不喜欢这个问题。什么是想干什么?您要解决什么具体问题?取而代之的是,我将其转换为社区Wiki,从而使其更像是一种讨论形式。
Tetrad 2010年

我认为最好对此应用某种格式(例如版本控制问题)。
杰西·多尔西

Answers:


9

Google的协议缓冲区可能是序列化c ++对象的一种很好的方法。作为序列化过程的一部分,您可能必须制作一些中间对象,但它也可以在许多平台和语言中使用。


1
我正在使用它,如果您可以在构建系统中自动化代码生成,这很容易。尽管一个真正的极好的优点是它允许您在不考虑所使用平台的情况下在远程计算机上传输数据,并且对此进行了优化,所以生成的对象并不大。
克莱姆(Klaim)2010年

10

我们在游戏中只使用boost.serilization,它很容易使用并且非常快,但是我认为这对savegame很有用。如果您尝试创建字符,我建议您使用一些基于XML或JSON的东西,因为即使您没有编辑器,它们也易于阅读和编辑。


我已经看到boost :: serialization也成功用于客户端/服务器通信。但是,AFAIK是基于流的,因此它并不是完全兼容版本的。这可能不是客户端/服务器通信的交易突破点,但是如果将其用于保存的游戏,那么对游戏数据结构的任何更改都将使虚拟加载较旧的已保存游戏成为不可能(对加载较旧对象版本的支持变得非常繁琐) )。
Mike Strobel,2010年

2
@MikeStrobel我最近正在审查一些序列化和json套件,并遇到了此评论。boost :: serialization明确支持版本控制。序列化调用可以接收版本号,然后由用户来实现基本的分支逻辑(if(version> 1.0)...)。总体看来还很健壮。
M2tM 2013年

可惜它似乎不支持自定义分配器/删除器。
JamesAMD

1
我刚刚从boost序列化移植到了谷类。港口非常顺利。它像魅力一样运作。Cereal支持xml,json,binary和Portable Binary。我移植谷物的原因是最后一个。我需要可移植的二进制归档文件,因为我需要运行一台服务器,客户端(现在是Mac,不久之后将是iOS和Android)连接到该服务器。我对boost序列化感到非常满意,但是我认为谷物的某些功能可以更好地将其进一步发展,例如所提到的可移植二进制序列化。对于语言互操作协议缓冲区,这样更好。
赫尔曼DIAGO

根据文档,boost.serialization不是线程安全的。Cereal也不使用类似的API。
Hi-Angel


2

Google FlatBuffers是针对C ++的高效跨平台序列化库,支持Java和Go。它是由Google创建的,专门用于游戏开发和其他对性能至关重要的应用程序。

根据Apache许可证v2,它可以作为开源使用。



1

XDS正是为此目的而设计的,它为您提供了XML在开发过程中的好处以及在分发时使用紧凑的二进制表示的好处。


我不太确定是什么使XDS与Google协议缓冲区不同?它们似乎达到了相同的目的,只是XDS是第一个。
jacmoe 2010年

您确定是XSD而不是XDS吗?我想发布有关它的答案以完成列表。codesynthesis.com/products/xsd
v.oddou 2014年

1

如果您使用的是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;
}

0

jsonCpp和Protocol缓冲区都是不错的选择。据我所知,这两种方法都只允许您直接使用串行树结构(如果我错了,请纠正我)。boost :: serialization可以处理任意图形,但是没有像json这样好的文本格式(我认为有一种xml格式)

我个人认为Dojo采取的json序列化方法是最好的
http://docs.dojocampus.org/dojox/json/ref

我使用jsoncpp在c ++中创建了自己的版本,这也会反序列化类型化的对象(我对所有类型都有某种很大的工厂)。它使我能够从json文件集合中创建一个场景,无论如何我都可以引用它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.