在message_lite.h中定义了SerializeToString ,SerializeToArray ,SerializeToCodedStream ,SerializeToZeroCopyStream 其它序列化到IO流、序列化到文件等接口在它的子类message.h文件中提供。

另外,在util/json_util.h文件中定义了protobuf与json相互转换的接口(需要注意的是:当json字符串字段的值等于protobuf中字段的默认值,message->json则此字段不会出现在json中)。

#include <iostream>
#include <fstream>
#include <istream>
#include <string>#include <google/protobuf/io/coded_stream.h>
#include <google/protobuf/io/zero_copy_stream.h>
#include <google/protobuf/io/zero_copy_stream_impl.h>
#include <google/protobuf/util/json_util.h>#include <fcntl.h>
#include <unistd.h>#include "game.pb.h"void serializeToString(pt::rsp_login& rsp)
{//序列化到字符串和从字符串解析数据std::string str{};rsp.SerializeToString(&str);std::cout << "serialize to string:" << str << std::endl;pt::rsp_login rsp2{};rsp2.ParseFromString(str);std::cout << "parse from string size:" << rsp2.ByteSize() << std::endl;auto temp_str = rsp.SerializeAsString();std::cout << "serialize as string:" << temp_str << std::endl;
}void serializeToArray(pt::rsp_login& rsp)
{//序列化到数组和从数组解析数据std::vector<uint8_t> buff;buff.resize(rsp.ByteSize());rsp.SerializeToArray(buff.data(), buff.size());pt::rsp_login rsp2{};if (!rsp2.ParseFromArray(buff.data(), (int)buff.size())) {std::cout << "parse error\n";}std::cout << "parse from array size:" << rsp2.ByteSize() << std::endl;
}void serializeToCodeStream(pt::rsp_login& rsp)
{using namespace google::protobuf::io;int fd1 = open("myfile", O_CREAT | O_RDWR);if (fd1 == -1) {return;}ZeroCopyOutputStream *raw_output = new FileOutputStream(fd1);google::protobuf::io::CodedOutputStream coded_output(raw_output);rsp.SerializeToCodedStream(&coded_output);delete raw_output;close(fd1);pt::rsp_login rsp2{};int fd2 = open("myfile", O_RDONLY);if (fd2 == -1) {return;}ZeroCopyInputStream *raw_input = new FileInputStream(fd2);google::protobuf::io::CodedInputStream coded_input(raw_input);rsp2.ParseFromCodedStream(&coded_input);delete raw_input;close(fd2);
}void serializeToStream(pt::rsp_login& rsp)
{std::fstream fs1("stream.info", std::ios::out | std::ios::binary);rsp.SerializeToOstream(&fs1);fs1.close();pt::rsp_login rsp2{};std::fstream fs2("stream.info", std::ios::in | std::ios::binary);rsp2.ParseFromIstream(&fs2);fs2.close();std::cout << "parse in stream:" << rsp2.ByteSize() << std::endl;
}void serializeToFile(pt::rsp_login& rsp)
{//序列化到文件
    std::ofstream ofile;auto fd = open("game.info", O_CREAT | O_TRUNC | O_RDWR, 0644);if (fd <= 0) {std::cout << "open file error" << std::endl;return;}rsp.SerializeToFileDescriptor(fd);close(fd);pt::rsp_login rsp2{};fd = open("game.info", O_RDONLY);if (fd <= 0) {std::cout << "serialize to file error" << std::endl;return;}rsp2.ParseFromFileDescriptor(fd);close(fd);std::cout << "parse from file rsp2.size:" << rsp2.ByteSize() << std::endl;
}void jsonMessageConvent(pt::rsp_login& rsp)
{//如果字段值=protobuf中的类型默认值,则此字段不会转换到Json字符串中std::string json{};google::protobuf::util::MessageToJsonString(rsp, &json);std::cout << "message to json:" << json << std::endl;//json字符串中字段的值=protobuf中字段类型默认值,则此json字段不会转换到protobuf消息中
    pt::rsp_login rsp2{};google::protobuf::util::JsonStringToMessage(json, &rsp2);std::cout << "json to message size:" << rsp2.ByteSize() << std::endl;
}int main()
{pt::rsp_login rsp{};rsp.set_ret(pt::rsp_login_RET_SUCCESS);auto user_info = rsp.mutable_user_info();user_info->set_nickname("dsw");user_info->set_icon("345DS55GF34D774S");user_info->set_coin(2000);user_info->set_location("zh");for (int i = 0; i < 5; i++) {auto record = rsp.add_record();record->set_time("2017/4/13 12:22:11");record->set_kill(i * 4);record->set_dead(i * 2);record->set_assist(i * 5);}serializeToString(rsp);serializeToArray(rsp);serializeToCodeStream(rsp);serializeToStream(rsp);serializeToFile(rsp);jsonMessageConvent(rsp);return 0;
}

Protobuf3 序列化相关推荐

  1. Zookeeper序列化组件Jute分析

    2019独角兽企业重金招聘Python工程师标准>>> 简介 Jute是Zookeeper中的序列化组件,最初也是Hadoop中的默认序列化组件,前身就是Hadoop Record ...

  2. probuffer java_Protocol Buffer的使用

    Probotbuf简介 在网络通信和通用数据交换等应用场景中经常使用的技术是 JSON 或 XML,这两种技术常被用于数据的结构化呈现和序列化.我们可以从两个方面来看JSON 和 XML与protob ...

  3. 手把手教你如何在Unity中使用UnityGoogle.Protobuf3(三) 序列化与反序列化

    手把手教你使用Google.Protobuf3三 序列化与反序列化 1.Untiy工程创建 2.导入Google.Protobuf.dll 3.导入proto协议文件 4.编写序列化与反序列化工具类 ...

  4. ProtoBuf的介绍以及在Java中使用protobuf将对象进行序列化与反序列化

    场景 ProtoBuf简介 protocol buffers 是一种语言无关.平台无关.可扩展的序列化结构数据的方法,它可用于(数据)通信协议.数据存储等. Protocol Buffers 是一种灵 ...

  5. protobuf3 自定义option_Protobuf3 语法指南

    以前我翻译了 Protobuf2 语法指南,现在 千念飞羽把protobuf3的语法指南也翻译了,我也转载一下,读者可以有个参考. 译文地址是: Protobuf3语言指南. 英文原文: Langua ...

  6. hive序列生成_常见的序列化框架及Protobuf原理

    享学课堂作者:逐梦々少年 转载请声明出处! 上次我们详细的学习了Java中的序列化机制,但是我们日常开发过程中,因为java的序列化机制的压缩效率问题,以及序列化大小带来的传输的效率问题,一般很少会使 ...

  7. ProtoBuf3语法指南(Protocol Buffers)_下

    0.说明 ProtoBuf3语法指南, 又称为proto3, 是谷歌的Protocol Buffers第3个版本. 本文基于官方英文版本翻译, 加上了自己的理解少量修改, 一共分为上下两部分. 1.A ...

  8. ProtoBuf3语法指南(Protocol Buffers)_上

    0.说明 ProtoBuf3语法指南, 又称为proto3, 是谷歌的Protocol Buffers第3个版本. 本文基于官方英文版本翻译, 加上了自己的理解少量修改, 一共分为上下两部分. 1.序 ...

  9. protobuf3 自定义option_ProtoBuf3语法指南(Protocol Buffers)_下

    0.说明 ProtoBuf3语法指南, 又称为proto3, 是谷歌的Protocol Buffers第3个版本. 本文基于官方英文版本翻译, 加上了自己的理解少量修改, 一共分为上下两部分. 1.A ...

  10. Unity中使用Protobuf3.0

    今天准备在unity中使用protobuf, 但是遇到了一些问题,记录一下. 首先,我们到google protobuf github 上下载工程,主要有两个东西: 1.Protocol Compil ...

最新文章

  1. thinkphp5 404 file_put_contents 无法打开流:权限被拒绝
  2. token干什么用_浅谈Token理解运用
  3. java追加txt文件_java怎么追加写入txt文件
  4. Linux命令【三】gcc编译+静态库+动态库+makefile+gdb调试
  5. fat32硬盘格式能在苹果系统里读写操作吗?
  6. 动态添加和删除 ListView 项
  7. 李雅普诺夫稳定性理论的理解
  8. 南方cass快捷键命令修改在哪_南方CASS快捷命令
  9. android 添加一维数组,Android:打造“万能”Adapter与ViewHolder
  10. 基于51单片机+DS18B20温度测温器+LCD1602显示
  11. 数据库表设计:一对一、一对多、多对多
  12. SAP SM36如何设置后台作业 每月最后一天运行
  13. 获取本机号码及sim卡信息
  14. 16万大奖,名企offer,翼支付杯大数据建模大赛邀你来战!
  15. 信号与系统之(二)傅里叶级数和傅里叶变换
  16. 强迫症狂喜!PC端相册还能智能分类!
  17. sx1278组网-子设备
  18. 天涯孤岸软件商城-.net电子商务网站系统案例
  19. 另一个jar包引不了_《嫌疑人X的献身》:一个天才的陨落
  20. 正则表达式匹配最后一部分

热门文章

  1. lnmp升级PHP环境
  2. git小乌龟工具TortoiseGit记住你的账号密码
  3. 安徽考区计算机水平考试试卷,安徽考区计算机水平考试试卷2011.6
  4. WINDOWS蓝屏照片
  5. 热烈庆贺泰山字体引擎取得关键性突破
  6. i7-9700与E5 2667 V2空载功耗对比
  7. 全网首发:使用安卓MediaCodec Encoder进行编码时的方向问题
  8. 编译OpenJDK12:a microsoft compiler is required
  9. 面试考知识点,吾亦很难通过
  10. 光干涉波谷,有可能低于绝对零度