加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C方式序列化邮件?

发布时间:2020-12-16 10:30:22 所属栏目:百科 来源:网络整理
导读:在我目前的项目中,我有一些不同的接口,要求我将消息序列化为字节缓冲区.我觉得我可能不会这样做会让一个真正的C程序员开心(我想). 我通常会这样做: struct MyStruct { uint32_t x; uint64_t y; uint8_t z[80];};uint8_t* serialize(const MyStruct s) { uin
在我目前的项目中,我有一些不同的接口,要求我将消息序列化为字节缓冲区.我觉得我可能不会这样做会让一个真正的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实现.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读