Подтвердить что ты не робот

Как msgpack-пользовательский класс С++ с POD-массивами?

Как можно обеспечить все три функции: msgpack_pack, msgpack_unpack и msgpack_object (также, что их значения, точно?) для пользовательского класса С++ (таким же образом MSGPACK_DEFINE делает это для типов массивов POD/UD без массива), содержащих массивы Plain Old Data (например, dobule[] или char[]), поэтому мой класс будет хорошо играть с классами более высокого уровня, охватывая этот класс на карте или векторе?

Есть ли примеры их реализации для вашего собственного класса или, по крайней мере, документации msgpack С++ api?

Единственная ссылка на возможную ссылку api, которую я нашел, была http://redmine.msgpack.org/projects/msgpack/wiki; но теперь он мертв.

Скажем, у меня есть структура вроде

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

Что будет для него функцией msgpack_ *?

4b9b3361

Ответ 1

Спасибо парню, который задал мой вопрос, я почувствовал жалобу и исследовал реальную недокументированную кодовую базу msgpack. Вот пример упомянутых ранее функций с каким-то объяснением в объеме моего (значительно неполного из-за недостающих документов) понимания:

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 { 

  }
};