struct中float向量的序列化

时间:2016-11-03 13:34:26

标签: c++ serialization deserialization

我有以下代码:

struct MsgDetectedTarget
{
    int target_id;
    float bbox[4]; // need to change
};

在序列化函数中:

void SerializeToArray(std::vector<char>& buffer, int& dst_len, void* pMsg, int len){
    buffer.resize(HEADER_LENGTH + len);
    // encode message header
    char header[HEADER_LENGTH + 1] = "";
    std::sprintf(header, "%8d", len);

    std::memcpy(&buffer[0], header, HEADER_LENGTH);

    // encode message body
    std::memcpy(&buffer[0]+HEADER_LENGTH, reinterpret_cast<char*>(pMsg), len);

    dst_len = HEADER_LENGTH + len;
}

如果MsgDetectedTarget中的数据bbox具有固定大小,则很容易进行序列化。

  MsgDetectedTarget msg;
  msg.target_id = 1;
  msg.bbox[0] = 0;
  msg.bbox[1] = 0;
  msg.bbox[2] = 500;
  msg.bbox[3] = 500;

  std::vector<char> msgdata;
  int destlen;
  SerializeToArray(msgdata, destlen, &msg, sizeof(msg));

问题:

我想将MsgDetectedTarget中的bbox更改为float的向量,如何执行相应的序列化和反序列化?

非常感谢。

1 个答案:

答案 0 :(得分:0)

如果您不能使用Boost序列化,您可以执行@ Jean-FrancoisFabre建议的操作。类似的东西:

void SerializeToArray(std::vector<char>& buffer, int& dst_len, MsgDetectedTarget* msg) {
    size_t numFloats = msg->bbox.size();
    auto len = sizeof(int) + sizeof(size_t) + sizeof(float)*numFloats;
    buffer.resize(HEADER_LENGTH + len);

    // encode message header
    char header[HEADER_LENGTH + 1] = "";
    std::sprintf(header, "%8d", len);
    std::memcpy(&buffer[0], header, HEADER_LENGTH);

    // encode target_id
    std::memcpy(&buffer[0] + HEADER_LENGTH, static_cast<char*>(&msg->target_id), sizeof(int));

    // encode numFloats
    std::memcpy(&buffer[0] + HEADER_LENGTH + sizeof(int), static_cast<char*>(&numFloats), sizeof(size_t));

    // encode the vector of float
    std::memcpy(&buffer[0] + HEADER_LENGTH + sizeof(int) + sizeof(size_t),
                static_cast<char*>(&bbox[0]), sizeof(float)*numFloats);

    dst_len = HEADER_LENGTH + len;
}