2013-05-11 30 views
11

Làm thế nào có thể cung cấp tất cả ba chức năng: msgpack_pack, msgpack_unpackmsgpack_object (cũng vậy, ý nghĩa của chúng là gì?) Cho lớp C++ do người dùng xác định (giống như cách MSGPACK_DEFINE thực hiện nó cho mảng không phải mảng) Các loại UD) có chứa các mảng dữ liệu cũ thuần túy (chẳng hạn như dobule[] hoặc char[]), vì vậy lớp học của tôi sẽ chơi độc đáo với các lớp cấp cao hơn, tiếp tục lớp này trong bản đồ hoặc một véc tơ?Làm thế nào để msgpack một lớp C++ do người dùng định nghĩa với các mảng POD?

Có ví dụ nào về việc triển khai chúng cho lớp của riêng bạn hoặc ít nhất là tài liệu api msgpack C++ api không?

Liên kết duy nhất để tham chiếu api có thể tôi đã tìm thấy là http://redmine.msgpack.org/projects/msgpack/wiki; nhưng nó đã chết rồi.

nói, tôi có một cấu trúc giống như

struct entity { 
    const char name[256]; 
    double mat[16]; 
}; 

Điều gì sẽ là một msgpack_ * hàm thành viên cho nó?

+0

Câu hỏi của bạn là tốt và được hỏi một cách hợp lý. Bạn cũng có ít nhất là trong một số nỗ lực để đọc các tài liệu. Một số người sẽ cung cấp cho lái xe-downvotes - có lẽ bởi vì họ không thể trả lời các câu hỏi và cảm thấy khinh miệt cho mất tích trên ghi một số upvotes. Boo cho họ. 1 cho bạn. –

Trả lời

13

Nhờ anh chàng đã đặt câu hỏi của tôi, tôi cảm thấy khiếu nại và khám phá mã nguồn không được giấy tờ thực tế của msgpack. Dưới đây là ví dụ về các chức năng đã đề cập trước đó với loại giải thích, với số lượng (hiểu không đầy đủ do thiếu tài liệu) của tôi:

struct entity { 
    char name[256]; 
    double mat[16]; 

    // this function is appears to be a mere serializer 
    template <typename Packer> 
    void msgpack_pack(Packer& pk) const { 
    // make array of two elements, by the number of class fields 
    pk.pack_array(2); 

    // pack the first field, strightforward 
    pk.pack_raw(sizeof(name)); 
    pk.pack_raw_body(name, sizeof(name)); 

    // since it is array of doubles, we can't use direct conversion or copying 
    // memory because it would be a machine-dependent representation of floats 
    // instead, we converting this POD array to some msgpack array, like this: 
    pk.pack_array(16); 
    for (int i = 0; i < 16; i++) { 
     pk.pack_double(mat[i]); 
    } 
    } 

    // this function is looks like de-serializer, taking an msgpack object 
    // and extracting data from it to the current class fields 
    void msgpack_unpack(msgpack::object o) { 
    // check if received structure is an array 
    if(o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); } 

    const size_t size = o.via.array.size; 

    // sanity check 
    if(size <= 0) return; 
    // extract value of first array entry to a class field 
    memcpy(name, o.via.array.ptr[0].via.raw.ptr, o.via.array.ptr[0].via.raw.size); 

    // sanity check 
    if(size <= 1) return; 
    // extract value of second array entry which is array itself: 
    for (int i = 0; i < 16 ; i++) { 
     mat[i] = o.via.array.ptr[1].via.array.ptr[i].via.dec; 
    } 
    } 

    // destination of this function is unknown - i've never ran into scenary 
    // what it was called. some explaination/documentation needed. 
    template <typename MSGPACK_OBJECT> 
    void msgpack_object(MSGPACK_OBJECT* o, msgpack::zone* z) const { 

    } 
}; 
Các vấn đề liên quan