重复数据类型

protobuf语言的重复字段类型相当于C++的std::list数据类型

工程目录结构

  1. $ ls proto/
  2. TServer.proto TSession.proto

proto文件

  1. $ cat TSession.proto
  2. syntax = "proto3";
  3. //枚举类型可以放外面,也可以放message里面
  4. enum Status
  5. {
  6. INVALID = 0;
  7. VALID = 1;
  8. };
  9. message TSession
  10. {
  11. string owner = 1;
  12. Status status = 2;
  13. };
  14. $ cat TServer.proto
  15. syntax = "proto3";
  16. import "TSession.proto";
  17. //通过repeated来模拟链表的可变长度
  18. message TServer
  19. {
  20. repeated TSession sessions = 1;
  21. };

读写源文件

  1. $ cat writer.cpp
  2. #include <fstream>
  3. #include <iostream>
  4. #include <string>
  5. #include "TServer.pb.h"
  6. using namespace std;
  7. int main(int argc, char *argv[])
  8. {
  9. TServer srv;
  10. std::string owner;
  11. while(true)
  12. {
  13. std::getline(std::cin, owner);
  14. if (owner.empty())
  15. break;
  16. //自动生成一个新的节点,并返回对象指针
  17. TSession* s = srv.add_sessions();
  18. s->set_owner(owner);
  19. s->set_status(Status::VALID);
  20. }
  21. fstream output("./log", ios::out | ios::trunc | ios::binary);
  22. cout << "Serialize start." << endl;
  23. if (!srv.SerializeToOstream(&output))
  24. {
  25. cout << "Serialize failed." << endl;
  26. return -1;
  27. }
  28. output.close();
  29. cout << "Serialize end." << endl;
  30. return 0;
  31. }
  32. $ cat reader.cpp
  33. #include <fstream>
  34. #include <iostream>
  35. #include "TServer.pb.h"
  36. using namespace std;
  37. int main(int argc, char *argv[])
  38. {
  39. fstream input("./log", ios::in | ios::binary);
  40. cout << "Deserialize start." << endl;
  41. TServer srv;
  42. if (!srv.ParseFromIstream(&input))
  43. {
  44. cout << "Deserialize failed." << endl;
  45. return -1;
  46. }
  47. cout << "First Method" << endl;
  48. for (int i = 0; i < srv.sessions_size(); i++)
  49. srv.sessions(i).PrintDebugString();
  50. cout << "Second Method" << endl;
  51. auto sessions = srv.sessions();
  52. for (auto iter = sessions.begin(); iter != sessions.end(); iter++)
  53. iter->PrintDebugString();
  54. cout << "Deserialize end." << endl;
  55. input.close();
  56. return 0;
  57. }

ProtoBuf练习(二)的更多相关文章

  1. netty + Protobuf (整合二)

    [正文]Protobuf 消息设计 疯狂创客圈 死磕Netty 系列之12 [博客园 总入口 ] 本文说明 本篇是 netty+Protobuf 实战的第二篇,完成一个 基于Netty + Proto ...

  2. Sword protobuf学习二

    编写protobuf消息文件 文件格式: xxx.proto //标明使用哪个版本的protobuf,默认2.0版本 syntax = "proto3"; //类似于c++中的na ...

  3. 【咸鱼教程】protobuf在websocket通讯中的使用

    教程目录一 protobuf简介二 使用protobuf三 Demo下载 参考: CSDN:Egret项目中使用protobuf(protobufjs) TS项目中使用Protobuf的解决方案(ba ...

  4. erlang抽象码与basho的protobuf

    erlang抽象码与basho的protobuf(一)使用 erlang抽象码与basho的protobuf(二)代码生成原理之词法与语法分析 erlang抽象码与basho的protobuf(三)代 ...

  5. Go - 如何编写 ProtoBuf 插件 (三) ?

    目录 前言 演示代码 小结 推荐阅读 前言 上篇文章<Go - 如何编写 ProtoBuf 插件 (二) >,分享了基于 自定义选项 定义了 interceptor 插件,然后在 hell ...

  6. 【ProtoBuffer】windows上安装ProtoBuffer3.1.0 (附已编译资源)

    ------- 17.9.17更新  --- 以下这些方法都是扯淡,对我的机器不适用,我后来花了最后成功安装并亲测可用的方法不是靠vs编过的,vs生成的库引入后函数全部报undefine refere ...

  7. ubuntu 16.04 安装caffe2的方法及问题解决

    工作需要安装caffe2,从用户体验上来讲,caffe2的安装绝对是体验比较差的那种,花费了我那么多时间去倒腾,这样的用户体验的产品,估计后面是比较危险的. 废话少说,直接上步骤: 官网上有安装目录, ...

  8. Golang gRPC 和 gRPC-gateway 结合使用

    一.安装 go get -u github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway go get -u github.com/g ...

  9. Netty 粘包/半包原理与拆包实战

    Java NIO 粘包 拆包 (实战) - 史上最全解读 - 疯狂创客圈 - 博客园 https://www.cnblogs.com/crazymakercircle/p/9941658.html 本 ...

  10. 疯狂创客圈 JAVA死磕系列 总目录

    无编程不创客,无案例不学习.疯狂创客圈,一大波高手正在交流.学习中! 疯狂创客圈 Java 死磕系列: [博客园 总入口]  QQ群:104131248 [Java 聊天室] 实战从0开始,打造100 ...

随机推荐

  1. matlab函数之imresize()

    B = imresize(A,scale) B = imresize(A,scale) 返回图像 B,它是将 A 的长宽大小缩放 scale 倍之后的图像.输入图像 A 可以是灰度.RGB 或二值图像 ...

  2. 创建 CSS3 下拉菜单

    1. [图片] 菜单效果 2. [代码]menu.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" ...

  3. php数据结构课程---1、数据结构基础介绍(程序是什么)

    php数据结构课程---1.数据结构基础介绍(程序是什么) 一.总结 一句话总结: 程序=数据结构+算法 设计好数据结构,程序就等于成功了一半. 数据结构是程序设计的基石. 1.数据的逻辑结构和物理结 ...

  4. GeoServer基础教程(三):部署发布Shapefile地图数据

    转载:http://blog.csdn.net/mingzai624. 这是GeoServer官方网站提供的一份Shapefile测试数据 nyc_roads.zip ,包含了部分纽约的道路信息,我们 ...

  5. Git_学习_05_ 解决冲突

    二.参考资料 1.使用git pull文件时和本地文件冲突怎么办? 2.git 冲突解决

  6. 【二叉树的递归】02二叉树的最大深度【Maximum Depth of Binary Tree】

    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 给定一个二叉树,找出他的最小的深度 ...

  7. Skype SILK codec overview

    最近简单看了一下Skype SILK codec 算法, 基本原理和流程大体明白了, 以后有时间再仔细研究一下细节,今天就简单说说. SILK Codec是一个语音和音频编解码算法, 对于音频带宽.网 ...

  8. bzoj 2300: [HAOI2011]防线修建 凸包

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=2300 题解 这道题让我们维护一个支持动态删除点的上凸壳 并且告诉了我们三个一定不会被删除 ...

  9. [转]基于phantomJS实现web性能监控

    1.web性能监控背景描述 上期分享的<Web性能监控自动化探索之路–初识WebPageTest>从依赖webpagetest的角度给出了做性能日常检查的方案,但由于依赖结构相对复杂我们需 ...

  10. BZOJ4010:[HNOI2015]菜肴制作

    我对贪心的理解:https://www.cnblogs.com/AKMer/p/9776293.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem ...