C ++ 'da serileştirme için iyi çözümler nelerdir? [kapalı]


18

Oyun geliştiricilerinin oyunları için uğraştıkları farklı veri türlerini serileştirmek için hangi çözümleri bulduğunu merak ediyorum. Türetilmiş türler için bir serileştirme arabirimi barındıran, belirli RTTI tabanlı çözüm türlerini kullanan, belirli sınıflar için açık akış serileştirme veya açık kaynak çözümlerinden bazılarını kullanan bazı monolitik GameObject hiyerarşisi kullanıyor musunuz (boost :: serialization, s11n, vb).


1
Oyun geliştirme programlamasında serileştirmenin önemli bir konu olduğunu düşünüyorum, ancak bu soruyu sevmiyorum. Ne edilmektedir sen yapmaya çalışıyor? Hangi spesifik sorunları çözmeye çalışıyorsunuz? Bunun yerine, daha çok bir tartışma formatı olması için bir topluluk wikisine dönüştürdüm.
Tetrad

Ben buna bazı biçimlendirme uygulamak iyi olacağını düşünüyorum, (ala versiyon kontrol sorusu).
Jesse Dorsey

Yanıtlar:


9

Google'dan protokol arabellekleri , c ++ nesnelerini serileştirmek için oldukça iyi bir yaklaşım olabilir. Serileştirme sürecinin bir parçası olarak bazı aracı nesneler yapmanız gerekebilir, ancak aynı zamanda birçok platform ve dilde de çalışır.


1
Ben kullanıyorum ve yapı sisteminizde kod oluşturma otomatikleştirebilirsiniz eğer kolaydır. Gerçekten mükemmel bir avantaj, kullanılan platformla ilgili olmadan uzak makinelerde veri aktarmanıza izin vermesidir ve bunun için optimize edilmiştir, böylece üretilen nesneler büyük değildir.
Klaim

10

Oyunumuzda sadece boost.serilizasyon kullanıyoruz , kullanımı kolay ve çok hızlı, ama bence sadece savegames için yararlı. Karakter oluşturmayı denerseniz, XML'ish veya JSON tabanlı bir şey öneriyorum, çünkü editörünüz olmasa bile okunması kolay ve düzenlenebilir.


Istemci / sunucu iletişimi için de başarıyla kullanılan boost :: serileştirme gördüm. Bununla birlikte, AFAIK akış tabanlıdır, bu yüzden tam olarak sürüm toleranslı değildir. Bu, istemci / sunucu iletişimi için bir anlaşma kırıcı olmayabilir, ancak kaydedilmiş oyunlar için kullanırsanız, oyun veri yapılarında yapılan herhangi bir değişiklik, eski kaydedilmiş oyunların yüklenmesini sanal bir imkansız hale getirir (eski nesne sürümlerini yükleme desteği gerçek bir angarya haline gelir ).
Mike Strobel

2
@MikeStrobel Geçenlerde birkaç serileştirme ve json kitini inceliyordum ve bu yoruma rastladım. boost :: serialization açıkça sürümlendirmeyi destekler. Serileştirme çağrıları bir sürüm numarası alabilir ve daha sonra temel dallanma mantığını uygulamak kullanıcıya kalmıştır ((sürüm> 1.0) ...). Genel olarak oldukça sağlam görünüyor.
M2TM

Yazık ki özel bölücü / silmeyi desteklemiyor gibi görünüyor.
JamesAMD

1
Artış serileştirmeden hububata geçtim. Liman oldukça yumuşaktı . Bir cazibe gibi çalıştı. Tahıl xml, json, ikili ve taşınabilir ikili destekler . Tahıl için taşınmamın nedeni sonuncuydu. Taşınabilir ikili arşivlere ihtiyacım vardı çünkü istemcilerin (şimdilik bir Mac, yakında iOS ve Android) bağlandığı bir sunucu çalıştırıyorum. Destek serileştirmesinden oldukça memnun kaldım, ancak tahılın bazı özelliklerinin söz konusu taşınabilir ikili serileştirme gibi daha iyi bir adım daha ileri götürdüğünü düşünüyorum. Dil birlikte çalışma protokolü için tamponlar ve daha iyidir.
Germán Diago

Doküman başına artış. Seri numarası güvenli değil. Benzer bir API kullanan Cereal da değildir.
Hi-Melek


2

Google FlatBuffers , Java ve Go desteğiyle C ++ için verimli bir platformlar arası serileştirme kütüphanesidir. Google'da, özellikle oyun geliştirme ve diğer performans açısından kritik uygulamalar için oluşturuldu.

Apache lisansı v2 altında açık kaynak olarak mevcuttur.



1

XDS sadece bu amaç için tasarlandı, geliştirme sırasında XML'in avantajlarını ve dağıtım sırasında kompakt bir ikili sunumun avantajlarını sunuyor.


XDS'yi Google Protokol Tamponlarından farklı kılan şeyin ne olduğundan emin değilim? XDS'nin ilk olması dışında aynı amaca hizmet ediyor gibi görünüyorlar.
jacmoe

Kesinlikle XDS değil, XSD mi demek istediniz? codesynthesis.com/products/xsd Listeyi tamamlamak için bu konuda bir cevap göndermek istedim.
v.oddou

1

Bir Linux platformundaysanız, json.hserileştirme için doğrudan kitaplığı kullanabilirsiniz . İşte ben rastlamak örnek kod. Kaynak: 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

Hem jsonCpp hem de Protokol arabellekleri iyi seçeneklerdir. Bildiğim kadarıyla her ikisi de sadece seri ağaç yapılarını kutudan çıkarmanıza izin verecek (lütfen yanılıyorsam beni düzeltin). boost :: serileştirme keyfi grafikleri işleyebilir, ancak json gibi güzel bir metin biçimine sahip değildir (bir xml biçimi olduğunu düşünüyorum)

Şahsen Dojo'nun aldığı json serileştirme yaklaşımının en iyisi olduğunu düşünüyorum
http://docs.dojocampus.org/dojox/json/ref

C ++ kullanarak jsoncpp kullanarak kendi versiyonunu yaptım, bu da yazılan nesneleri serileştirir (tüm tiplerim için büyük bir fabrikam var). Bana yine de başvurulabilir json dosyaları koleksiyonundan bir sahne yapmak için izin verir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.