运维开发网

C方式序列化邮件?

运维开发网 https://www.qedev.com 2020-04-10 15:32 出处:网络 作者:运维开发网整理
在我目前的项目中,我有一些不同的接口,要求我将消息序列化为字节缓冲区.我觉得我可能不会这样做会让一个真正的C程序员开心(我想). 我通常会这样做: struct MyStruct { uint32_t x; uint64_t y; uint8_t z[80]; }; uint8_t* serialize(const MyStruct& s) { uint8_t*
在我目前的项目中,我有一些不同的接口,要求我将消息序列化为字节缓冲区.我觉得我可能不会这样做会让一个真正的C程序员开心(我想).

我通常会这样做:

struct MyStruct {
    uint32_t x;
    uint64_t y;
    uint8_t  z[80];
};

uint8_t* serialize(const MyStruct& s) {
    uint8_t* buffer = new uint8_t[sizeof(s)];
    uint8_t* temp = buffer;
    memcpy(temp, &s.x, sizeof(s.x));
    temp += sizeof(s.x);

    //would also have put in network byte order...
    ... etc ...

    return buffer;
}

请原谅任何错别字,这只是我头脑中的一个例子.如果我正在序列化的结构有内部指针,显然它会变得更复杂.

所以,我有两个密切相关的问题:

>上面的特定场景中是否存在任何问题,通过将结构直接转换为char缓冲区进行序列化,假设我知道目标系统具有相同的字节顺序?

>主要问题:有没有更好……呃…… C?除了添加智能指针之外,还能做到这一点吗?我觉得这是一个常见的问题,STL可能会处理它 – 如果没有,我相信无论如何使用C机制有更好的方法.

如果您可以使用标准C / STL更好地序列化此结构,而不添加库,那么编辑奖励积分.

您可能想看看Google Protocol Buffers(也称为protobuf).您可以使用语言中性IDL定义数据,然后通过生成器运行它以生成C类.它会处理字节排序问题,并且可以提供非常紧凑的二进制形式.

通过使用它,您不仅可以保存C数据,而且可以在其他语言(C#,Java,Python等)中使用,因为有可用的protobuf实现.

0

精彩评论

暂无评论...
验证码 换一张
取 消