static void serialize(Type &map, ContentSerializer &serializer) { serializer.write_map(map, [&](color_t key, typename Inner::Type *value) { color_t &color = serializer.write_object<color_t>(); color = key; REINDEER_SCOPE(Map) serialize_inner(*value, serializer); }); }
//////////////////////////////////////////////////////////////////////////////// //// //// Payload classes //// //////////////////////////////////////////////////////////////////////////////// vector<uint8_t> Payload::serialize(uint32_t magic_word) const { //serialize payload auto payload_size = serialize_inner(nullptr); vector<uint8_t> msg; msg.resize(MESSAGE_HEADER_LEN + payload_size); if (payload_size > 0) serialize_inner(&msg[MESSAGE_HEADER_LEN]); //magic word uint8_t* ptr = &msg[0]; uint32_t* magicword = (uint32_t*)(ptr + MAGIC_WORD_OFFSET); *magicword = magic_word; //message type auto&& type = typeStr(); char* msgtype = (char*)(ptr + MESSAGE_TYPE_OFFSET); memset(msgtype, 0, MESSAGE_TYPE_LEN); memcpy(msgtype, type.c_str(), type.size()); //length uint32_t msglen = payload_size; uint32_t* msglenptr = (uint32_t*)(ptr + PAYLOAD_LENGTH_OFFSET); *msglenptr = msglen; //checksum uint8_t* payloadptr = nullptr; if (payload_size > 0) payloadptr = &msg[MESSAGE_HEADER_LEN]; BinaryDataRef bdr(payloadptr, payload_size); auto&& hash = BtcUtils::getHash256(bdr); uint32_t* checksum = (uint32_t*)hash.getPtr(); uint32_t* checksumptr = (uint32_t*)(ptr + CHECKSUM_OFFSET); *checksumptr = *checksum; return msg; }