C ++에서 직렬화를위한 좋은 솔루션은 무엇입니까? [닫은]


18

게임 개발자가 게임을 처리하는 다양한 유형의 데이터를 직렬화하기 위해 게임 개발자가 어떤 솔루션을 개발했는지 궁금합니다. 파생 된 유형에 대한 직렬화 인터페이스를 포함하는 모 놀리 식 GameObject 계층 구조를 사용하고, 일종의 사용자 정의 RTTI 기반 솔루션을 사용하거나, 특정 클래스에 대해 명시 적 스트림 직렬화를 수행하거나, 일부 오픈 소스 솔루션을 사용합니까 (boost :: serialization, s11n, 기타).


1
게임 개발 프로그래밍의 직렬화는 중요한 주제라고 생각하지만이 질문은 마음에 들지 않습니다. 무엇 하려고합니까? 어떤 특정한 문제 를 해결하려고합니까? 그 대신, 나는 그것을 토론 형식으로 만들기 위해 커뮤니티 위키로 변환했습니다.
Tetrad

나는 이것에 일부 형식을 적용하는 것이 좋을 것이라고 생각합니다 (버전 관리 질문).
Jesse Dorsey

답변:


9

Google의 프로토콜 버퍼 는 c ++ 객체를 직렬화하는 데 매우 좋은 접근 방법입니다. 직렬화 프로세스의 일부로 일부 중간 오브젝트를 작성해야 할 수도 있지만 여러 플랫폼 및 언어에서도 작동합니다.


1
나는 그것을 사용하고 있으며 빌드 시스템에서 코드 생성을 자동화 할 수 있다면 쉽습니다. 실제로 탁월한 이점은 사용 된 플랫폼에 관계없이 원격 마키 니에서 데이터를 전송할 수 있으며 생성 된 객체가 크지 않도록 최적화되어 있다는 것입니다.
Klaim

10

우리는 게임에서 단순히 boost.serilization 을 사용합니다. 사용하기 쉽고 매우 빠르지 만 제 생각에는 savegames에 유용합니다. 문자를 만들려고하면 편집기가 없어도 쉽게 읽고 편집 할 수 있기 때문에 XML'ish 또는 JSON 기반 항목을 사용하는 것이 좋습니다.


클라이언트 / 서버 통신에도 boost :: serialization이 성공적으로 사용되었습니다. 그러나 AFAIK는 스트림 기반이므로 정확히 버전을 허용하지 않습니다. 클라이언트 / 서버 통신을위한 거래 차단기는 아니지만 저장된 게임에 사용하는 경우 게임 데이터 구조를 변경하면 오래된 저장된 게임을 실제로로드 할 수 없게됩니다. ).
Mike Strobel

2
@MikeStrobel 나는 최근에 몇 가지 직렬화 및 json 키트를 검토 하고이 의견을 발견했습니다. boost :: serialization은 명시 적으로 버전 관리를 지원합니다. 직렬화 호출은 버전 번호를 수신 한 다음 기본 분기 논리를 구현하는 것은 사용자의 몫입니다 (if (version> 1.0) ...). 전반적으로 꽤 견고합니다.
M2tM

커스텀 할당 자 / 삭제기를 지원하지 않는 것 같습니다.
JamesAMD

1
부스트 직렬화에서 시리얼로 포팅했습니다. 항구는 매우 매끄 럽습니다 . 그것은 매력처럼 작동했습니다. 시리얼은 xml, json, 바이너리 및 휴대용 바이너리를 지원 합니다. 내가 시리얼에 이식 한 이유는 마지막이었다. 클라이언트 (현재는 Mac, 곧 iOS 및 Android)가 연결되는 서버를 실행하기 때문에 휴대용 바이너리 아카이브가 필요했습니다. 부스트 직렬화에 매우 만족했지만 시리얼의 일부 기능은 언급 된 휴대용 이진 직렬화와 같이 더 나은 방법으로 한 단계 더 발전한다고 생각합니다. 언어 interop 프로토콜 버퍼의 경우 더 좋습니다.
Germán Diago

문서 별 boost.serialization은 스레드로부터 안전하지 않습니다. 비슷한 API를 사용하는 시리얼도 마찬가지입니다 .
Hi-Angel

3

나는 직렬화를 위해 JSON을 좋아한다. 파싱하는 것은 매우 간단하며 http://jsoncpp.sourceforge.net/ 과 같은 무료 라이브러리가 있습니다. 저는 C ++에서 부스트 또는 RTTI의 팬이었던 적이 없습니다. Tinyxml은 XML 직렬화 및 역 직렬화에도 잘 작동합니다. http://www.grinninglizard.com/tinyxml/ 궁극적으로 나는 직렬화에 필요한 것보다 더 많은 시간을 보내고 싶지 않습니다.


2

Google FlatBuffers 는 Java 및 Go를 지원하는 C ++ 용 효율적인 크로스 플랫폼 직렬화 라이브러리입니다. 게임 개발 및 기타 성능이 중요한 응용 프로그램을 위해 특별히 Google에서 만들어졌습니다.

Apache 라이센스 v2에 따라 오픈 소스로 제공됩니다.



1

XDS 는 이러한 목적으로 만 개발되었으며 개발시 XML의 이점과 배포시 컴팩트 한 이진 표현의 이점을 제공합니다.


XDS가 Google 프로토콜 버퍼와 다른 점이 무엇인지 잘 모르겠습니다. 그들은 XDS가 처음이라는 것을 제외하고는 같은 목적을 수행하는 것 같습니다.
jacmoe

XDS가 아닌 XSD를 의미합니까? codesynthesis.com/products/xsd 나는 목록에 대한 답변을 게시하고 싶었다.
v.oddou

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 및 프로토콜 버퍼 모두 좋은 옵션입니다. 내 지식으로는 둘 다 상자에서 직렬 트리 구조를 직렬화 할 수 있습니다 (잘못된 경우 수정하십시오). 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.