โซลูชั่นที่ดีสำหรับการทำให้เป็นอนุกรมใน C ++ คืออะไร [ปิด]


18

ฉันอยากรู้ว่าผู้พัฒนาเกมมีวิธีแก้ปัญหาอย่างไรสำหรับการเรียงลำดับข้อมูลประเภทต่างๆที่พวกเขาจัดการกับเกมของพวกเขา พวกคุณใช้ลำดับชั้นของ GameObject แบบเสาหินที่มีอินเตอร์เฟซการทำให้เป็นอนุกรมสำหรับประเภทที่ได้รับมาใช้การเรียงลำดับของโซลูชันที่ใช้ RTTI ที่กำหนดเองทำการสตรีมเป็นอันดับอย่างชัดเจนสำหรับบางคลาสหรือใช้โซลูชันโอเพนซอร์สบางส่วน ฯลฯ )


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 :: การทำให้เป็นอนุกรมสนับสนุนการกำหนดเวอร์ชันอย่างชัดเจน การโทรแบบอนุกรมสามารถรับหมายเลขเวอร์ชันจากนั้นขึ้นอยู่กับผู้ใช้ในการใช้งานการแยกสาขาพื้นฐาน (ถ้า (เวอร์ชัน> 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/ ฉันไม่เคยเป็นแฟนตัวยงของการเพิ่มหรือ RTTI ใน C ++ Tinyxml ยังทำงานได้ดีสำหรับ xml ซีเรียลไลเซชันและดีซีเรียลไลเซชัน http://www.grinninglizard.com/tinyxml/ ในที่สุดฉันไม่ต้องการที่จะต้องใช้เวลามากไปกว่าที่ฉันต้องทำให้เป็นอันดับ


2

Google FlatBuffersเป็นห้องสมุดข้ามแพลตฟอร์มที่มีประสิทธิภาพสำหรับ C ++ พร้อมรองรับ Java และ Go มันถูกสร้างขึ้นที่ Google โดยเฉพาะสำหรับการพัฒนาเกมและแอปพลิเคชั่นที่สำคัญต่อประสิทธิภาพ

มันสามารถใช้ได้เป็นโอเพนซอร์สภายใต้ใบอนุญาต Apache, v2



1

XDSได้รับการออกแบบมาเพื่อการนี้โดยเฉพาะจะช่วยให้คุณได้รับประโยชน์ของ XML ในระหว่างการพัฒนาและประโยชน์ของการเป็นตัวแทนไบนารีแบบย่อในขณะที่มีการแจกจ่าย


ฉันไม่แน่ใจจริงๆว่าอะไรทำให้ XDS แตกต่างจากบัฟเฟอร์ของ Google Protocol ดูเหมือนว่าพวกเขาจะใช้จุดประสงค์เดียวกันยกเว้น XDS นั้นเป็นครั้งแรก
jacmoe

คุณหมายถึง XSD ไม่ใช่ XDS ใช่ไหม 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 และ Protocol เป็นตัวเลือกที่ดี สำหรับความรู้ของฉันทั้งคู่จะอนุญาตให้คุณสร้างโครงสร้างต้นไม้แบบอนุกรมออกจากกล่อง (โปรดแก้ไขให้ฉันถ้าฉันผิด) boost :: การทำให้เป็นอนุกรมสามารถจัดการกราฟโดยพลการ แต่ไม่มีรูปแบบข้อความที่ดีเช่น json (ฉันคิดว่ามีรูปแบบ xml)

โดยส่วนตัวฉันคิดว่าวิธีการจัดลำดับ json ที่ Dojo ใช้นั้นเป็นวิธีที่ดีที่สุด
http://docs.dojocampus.org/dojox/json/ref

ฉันสร้างเวอร์ชันของตัวเองใน c ++ โดยใช้ jsoncpp ซึ่งจะกำจัดวัตถุที่พิมพ์ลงไปด้วย (ฉันมีโรงงานขนาดใหญ่สำหรับทุกประเภทของฉัน) มันทำให้ฉันสามารถสร้างฉากจากชุดของไฟล์ json ที่สามารถอ้างอิงได้อย่างไรก็ตาม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.