Các giải pháp tốt để tuần tự hóa trong C ++ là gì? [đóng cửa]


18

Tôi tò mò không biết giải pháp nào mà các nhà phát triển trò chơi đã đưa ra để tuần tự hóa các loại dữ liệu khác nhau mà họ xử lý cho trò chơi của họ. Các bạn có sử dụng một số phân cấp GameObject nguyên khối chứa giao diện tuần tự hóa cho các loại dẫn xuất, sử dụng loại giải pháp dựa trên RTTI tùy chỉnh, thực hiện tuần tự hóa dòng rõ ràng cho các lớp nhất định hoặc sử dụng một số giải pháp nguồn mở (boost :: serialization, s11n, Vân vân).


1
Tôi nghĩ rằng tuần tự hóa trong lập trình phát triển trò chơi là một chủ đề quan trọng, nhưng tôi không thích câu hỏi này. Những gì bạn đang cố gắng để làm gì? Những vấn đề cụ thể mà bạn đang cố gắng giải quyết? Thay vào đó, tôi đã chuyển đổi nó thành wiki cộng đồng để nó có định dạng thảo luận nhiều hơn.
Tetrad

Tôi nghĩ sẽ tốt khi áp dụng một số công thức cho việc này, (ala câu hỏi kiểm soát phiên bản).
Jesse Dorsey

Câu trả lời:


9

Bộ đệm giao thức từ Google có thể là một cách tiếp cận khá tốt để tuần tự hóa các đối tượng c ++. Bạn có thể phải tạo một số đối tượng trung gian như một phần của quy trình tuần tự hóa, nhưng nó cũng hoạt động trên nhiều nền tảng và ngôn ngữ.


1
Tôi đang sử dụng nó và thật dễ dàng nếu bạn có thể tự động hóa việc tạo mã trong hệ thống xây dựng của mình. Mặc dù một lợi thế thực sự tuyệt vời là nó cho phép bạn truyền dữ liệu trên các máy móc từ xa mà không liên quan đến nền tảng được sử dụng và nó được tối ưu hóa cho điều đó để các đối tượng được tạo ra không lớn.
Klaim

10

Chúng tôi trong trò chơi của chúng tôi chỉ đơn giản là sử dụng boost.serilization , nó dễ sử dụng và rất nhanh, nhưng theo tôi thì nó chỉ hữu ích cho các trò chơi lưu trữ . Nếu bạn thử tạo các ký tự, tôi khuyên bạn nên sử dụng các thứ dựa trên XML hoặc JSON, bởi vì chúng dễ đọc và có thể chỉnh sửa ngay cả khi bạn không có trình soạn thảo.


Tôi cũng đã thấy boost :: serialization được sử dụng thành công cho giao tiếp máy khách / máy chủ. Tuy nhiên, AFAIK là dựa trên luồng, vì vậy nó không chính xác là phiên bản khoan dung. Đó có thể không phải là một công cụ phá vỡ giao tiếp máy khách / máy chủ, nhưng nếu bạn sử dụng nó cho các trò chơi đã lưu, thì bất kỳ thay đổi nào đối với cấu trúc dữ liệu trò chơi sẽ khiến việc tải các trò chơi đã lưu cũ trở thành không thể thực hiện được (hỗ trợ tải phiên bản đối tượng cũ trở thành một việc vặt thực sự ).
Mike Strobel

2
@MikeStrobel Gần đây tôi đã xem xét một vài bộ dụng cụ nối tiếp và json và tình cờ thấy bình luận này. boost :: serialization rõ ràng hỗ trợ phiên bản. Các cuộc gọi tuần tự hóa có thể nhận được một số phiên bản và sau đó tùy thuộc vào người dùng để thực hiện logic phân nhánh cơ bản (nếu (phiên bản> 1.0) ...). Nhìn chung có vẻ khá mạnh mẽ.
M2tM

Thật xấu hổ vì nó dường như không hỗ trợ cấp phát / deleter tùy chỉnh.
JamesAMD

1
Tôi vừa chuyển từ serial serial sang ngũ cốc. Các cổng đã được thông suốt trơn tru . Nó làm việc như một say mê. Ngũ cốc hỗ trợ xml, json, nhị phân và nhị phân di động . Lý do tại sao tôi chuyển sang ngũ cốc là lý do cuối cùng. Tôi cần lưu trữ nhị phân di động vì tôi chạy một máy chủ mà khách hàng (bây giờ là mac, sắp có iOS và Android) kết nối. Tôi khá hài lòng với việc tuần tự hóa tăng cường nhưng tôi nghĩ rằng một số tính năng của ngũ cốc sẽ đưa nó tiến thêm một bước theo cách tốt hơn, chẳng hạn như tuần tự hóa nhị phân di động được đề cập. Đối với bộ đệm giao thức interop ngôn ngữ và như vậy là tốt hơn.
Germán Diago

Mỗi tài liệu boost.serialization không phải là chủ đề an toàn. Ngũ cốc cũng không sử dụng API tương tự.
Hi-Angel

3

Tôi thích JSON để tuần tự hóa. Nó khá đơn giản để phân tích cú pháp và có các thư viện miễn phí có sẵn như http://jsoncpp.sourceforge.net/ Tôi chưa bao giờ là một fan hâm mộ của boost hoặc RTTI trong C ++. Tinyxml cũng hoạt động tốt cho việc xê-ri hóa và giải tuần tự xml. http://www.grinninglizard.com/tinyxml/ Cuối cùng, tôi không muốn phải mất nhiều thời gian hơn thời gian để đăng.


2

Google FlatBuffers là một thư viện tuần tự hóa đa nền tảng hiệu quả cho C ++, với sự hỗ trợ cho Java và Go. Nó được tạo ra tại Google dành riêng cho phát triển trò chơi và các ứng dụng quan trọng về hiệu năng khác.

Nó có sẵn dưới dạng nguồn mở theo giấy phép Apache, v2.



1

XDS được thiết kế chỉ cho mục đích này, nó mang lại cho bạn những lợi ích của XML trong quá trình phát triển và lợi ích của biểu diễn nhị phân nhỏ gọn tại thời điểm phân phối.


Tôi không thực sự chắc chắn điều gì làm cho XDS khác với Bộ đệm Giao thức của Google? Chúng dường như phục vụ cùng một mục đích, ngoại trừ XDS là lần đầu tiên.
jacmoe

Bạn chắc chắn có nghĩa là XSD chứ không phải XDS? Codeyntribution.com/products/xsd Tôi muốn đăng câu trả lời về nó để hoàn thành danh sách.
v.oddou

1

Nếu bạn đang ở trên nền tảng Linux, bạn có thể trực tiếp sử dụng json.hthư viện để tuần tự hóa. Đây là mã mẫu tôi đã đi qua. Nguồn: 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

Cả bộ đệm jsonCpp và Protocol đều là những lựa chọn tốt. Theo hiểu biết của tôi, cả hai sẽ chỉ cho phép bạn sắp xếp các cấu trúc cây nối tiếp ra khỏi hộp (vui lòng sửa lại cho tôi nếu tôi sai). boost :: serialization có thể xử lý các biểu đồ tùy ý, nhưng không có định dạng văn bản đẹp như json (tôi nghĩ có định dạng xml)

Cá nhân tôi nghĩ rằng cách tiếp cận cho việc xê-ri hóa json mà Dojo đã thực hiện là tốt nhất
http://docs.dojocampus.org/dojox/json/ref

Tôi đã tạo phiên bản của riêng nó trong c ++ bằng jsoncpp, điều đó cũng sẽ giải nén các đối tượng đã gõ (tôi có một nhà máy lớn cho tất cả các loại của mình). Nó cho phép tôi tạo một cảnh từ một tập hợp các tệp json có thể được tham chiếu bằng mọi cách tôi muốn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.