gpt4 book ai didi

c++ - C++中的数据包序列化

转载 作者:太空狗 更新时间:2023-10-29 23:06:15 28 4
gpt4 key购买 nike

我有一个项目对几种不同类型(Packet1Packet2...)进行数据包序列化。它们都扩展了一个 PacketHeader 类并进行了自己的序列化

这种方法看起来非常困惑且容易出错,尤其是随着字段数量的增长。

是否有更简洁、更面向对象和 C++ 的序列化方式(无需第 3 方库)?

class PacketHeader {
uint8_t type;
uint32_t id;
uint32_t seqNum;

virtual void serialize(uint8_t *buf, size_t size) {
int offset = 0;
PacketHeader n;
n.type = type;
n.id = htonl(id);
n.seqNum = htonl(seqNum);
memcpy(buf + offset, &(n.type), sizeof(n.type));
offset += sizeof(n.type);
memcpy(buf + offset, &(n.id), sizeof(n.id));
offset += sizeof(n.id);
memcpy(buf + offset, &n.seqNum, sizeof(n.seqNum));
offset += sizeof(n.seqNum);
}
}

class Packet1 : public PacketHeader {
uint32_t payload;

virtual void serialize(uint8_t *buf, size_t size) {
int offset = PacketHeader::size();
PacketHeader::serialize(buf, size);
memcpy(buf + offset, &n.payload, sizeof(n.payload));
offset += sizeof(n.payload);
}
}

最佳答案

对具有数据成员的结构和类进行 native 序列化需要您将每个成员的偏移量、大小和类型信息提供给序列化程序。这就是“困惑”方面的根源,无论您的设计多么优雅,您都无法避免它。

有一些帮助程序库可以为此提供一些结构,但它们通常只是语法糖,并且随着消息类型数量的增长仍然很难维护。

相反,我建议查看提供字典(键/值数据对象)的系统,而不是使用 native C++ 结构/类数据成员。有些使用标准的序列化格式,例如 JSON。 JSONCPP 是一个非常受欢迎的包,可以执行此操作:http://jsoncpp.sourceforge.net/

大多数情况下,它们提供的优势是软件系统会随着它的增长而更好地扩展,并且不会成为令人头疼的指数级维护问题。

如果需要二进制序列化,请查看 BSON、MessagePack、Google Protocol Buffers 和 Apache Thrift。它们都为 C++ 提供库或绑定(bind)。

关于c++ - C++中的数据包序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16470247/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com