2013-05-11 27 views
11

Her üç işlevi de sağlamak mümkün: Kullanıcı tanımlı bir C++ sınıfı için msgpack_pack, msgpack_unpack ve msgpack_object (ayrıca, bunların tam anlamı nedir?) (Aynı şekilde MSGPACK_DEFINE, dizi olmayan POD için yapar/Düz Eski Veri dizilerini içeren (örneğin, dobule[] veya char[]) UD türleri), sınıfım bu sınıfı haritada mi yoksa vektörle mi?Kullanıcı tanımlı bir C++ sınıfını POD dizileriyle nasıl msgpack?

Kendi sınıfınız veya en az msgpack C++ api belgeleriniz için bunları uygulama örnekleri var mı?

Bulduğum olası api referansının tek linki http://redmine.msgpack.org/projects/msgpack/wiki; ama şimdi öldü.

Say, ben bunun için bir msgpack_ ne olurdu

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

gibi bir yapı * üye işlevleri var?

+0

Sorunuz iyi bir ve makul bir şekilde sorulan olduğunu. Ayrıca, en azından dokümanlar okumak için biraz çaba harcadınız. Bazı insanlar, muhtemelen sorulara cevap veremedikleri ve bazı yükseltmeleri not almaktan muaf olduklarını düşündükleri için aşağıdan-aşağıya çekilecekler. Onlara Boo. Senin için +1. –

cevap

13

Sorularımın -1'ini yapan çocuğa teşekkür ederim, şikayet ettim ve msgpack'in gerçek belgesiz kod listesini araştırdım. İşte anlayış (Eksik dokümanlar için büyük ölçüde tamamlanmamış) benim tutarında, açıklama tür, daha önce bahsedilen fonksiyonların örneğidir:

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 { 

    } 
}; 
İlgili konular