【问题标题】:serialization of float vector in a struct结构中浮点向量的序列化
【发布时间】:2016-11-03 13:34:25
【问题描述】:

我有以下代码:

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的向量,如何进行对应的序列化和反序列化?

非常感谢。

【问题讨论】:

  • 我会先发送尺寸,然后再发送原始数据。
  • @Jean-FrancoisFabre 你能举个例子吗?
  • @Johnnylin 你真的需要发明自己的序列化吗?为什么不使用已经完成的现有序列化库?比如Boost serialization.
  • @Someprogrammerdude 对于Boost序列化,能举个例子吗?
  • 点击链接,阅读文档。您将找到教程和参考资料。

标签: c++ serialization deserialization


【解决方案1】:

如果你不能使用 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    相关资源
    最近更新 更多