2013-05-09 17 views
3

我有一个项目可以执行几种不同类型的数据包序列化(Packet1,Packet2 ...)。他们都延伸了一个PacketHeader类,并做了自己的序列化C++中的数据包序列化

这种方法看起来非常混乱和容易出错,特别是随着字段数量的增长。

是否有更清洁和更多的OOP & C++的序列化方式(没有第三方库)?

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); 
    } 
} 

回答

1

否则本身对结构和类以数据成员序列化需要你喂偏移量,大小,和每个成员到串行器类型信息。这是“凌乱”方面的根源,无论你的设计多么优雅,你都无法避免它。

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

相反,我会建议看看提供字典 - 键/值数据对象的系统 - 而不是使用本机C++结构/类数据成员。有些使用标准的序列化格式,如JSON。 JSONCPP是一个非常出色的软件包,它可以做到这一点:http://jsoncpp.sourceforge.net/

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

如果需要二进制序列化,请查看BSON,MessagePack,Google协议缓冲区和Apache Thrift。它们都提供C++库或绑定。