protobuf入门教程(三):常用序列化 反序列化接口_proto的serializewithcachedsizestoarray后如何反序列化

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

/*
//C数组的序列化和序列化API
//在/usr/local/include/google/目录下,查找包含"SerializeToArray"所有的文件,同时打印所在行
//sudo grep “SerializeToArray” -r /usr/local/include/google/ -n

bool SerializeToArray(void* data, int size) const; //序列化
bool ParseFromArray(const void* data, int size); //反序列化
*/
char buf[1024];
int len;

void set_person()
{
Person obj;
obj.set_name(“mike”);
obj.set_id(1);
*obj.mutable_email() = “xxx@qq.com”; //obj.set_email(“xxx@qq.com”);

len = obj.ByteSize(); //获取长度
cout << "len = " << len << endl;

obj.SerializeToArray(buf, len);//序列化,obj成员保存在buf中

}

void get_person()
{
Person obj;
obj.ParseFromArray(buf, len); //反序列化,buf的内容设置给obj的成员

cout << "name = " << obj.name() << endl;
cout << "id = " << obj.id() << endl;
cout << "email = " << obj.email() << endl;

}

int main()
{
// Verify that the version of the library that we linked against is
// compatible with the version of the headers we compiled against.
GOOGLE_PROTOBUF_VERIFY_VERSION;

set_person(); //序列化
get_person(); //反序列化

// Optional: Delete all global objects allocated by libprotobuf.
google::protobuf::ShutdownProtobufLibrary();

return 0;

}


![这里写图片描述](https://img-blog.csdn.net/20170629172120638?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGVubnlzb25za3k=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)


## C++ String的序列化和反序列化



//bool SerializeToString(string* output) const;
//bool ParseFromString(const string& data);

string str; //全局变量

void set_person()
{
Person obj;
obj.set_name(“mike”);
obj.set_id(1);
obj.set_email(“xxx@qq.com”);
//*obj.mutable_email() = “xxx@qq.com”;

obj.SerializeToString(&str);    //序列化,obj成员的内容设置给str

}

void get_person()
{
Person obj;
obj.ParseFromString(str); //反序列化, str内容设置给obj的成员

cout << "name = " << obj.name() << endl;
cout << "id = " << obj.id() << endl;
cout << "email = " << *obj.mutable_email() << endl;

}


## 文件描述符序列化和反序列化



//bool SerializeToFileDescriptor(int file_descriptor) const;
//bool ParseFromFileDescriptor(int file_descriptor);

void set_person()
{
Person obj;
obj.set_name(“mike”);
obj.set_id(1);
obj.set_email(“xxx@qq.com”);
//*obj.mutable_email() = “xxx@qq.com”;

//O\_CREAT: 新建文件, O\_TRUNC:清空文件,O\_RDWR:读写
int fd = open("./pb.xxx", O_CREAT | O_TRUNC | O_RDWR, 0644);
if (fd <= 0)
{
    perror("open");
    exit(0);
}

obj.SerializeToFileDescriptor(fd);  //序列化,obj成员的内容写入fd所关联的文件中

close(fd); //关闭文件

}

void get_person()
{
int fd = open(“./pb.xxx”, O_RDONLY); //O_RDONLY: 只读方式
if (fd <= 0)
{
perror(“open”);
exit(0);
}

Person obj;
obj.ParseFromFileDescriptor(fd); //反序列化, fd文件内容设置给obj的成员
close(fd); //关闭文件

cout << "name = " << obj.name() << endl;
cout << "id = " << obj.id() << endl;
cout << "email = " << *obj.mutable_email() << endl;

}


## C++ stream 序列化和反序列化



//bool SerializeToOstream(ostream* output) const;

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

  • 14
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值