Google Protocol Buffer(GPB)使用之完全解析二:有了GPB的日子怎么过?什么是GPB?

2024-02-06 16:08

本文主要是介绍Google Protocol Buffer(GPB)使用之完全解析二:有了GPB的日子怎么过?什么是GPB?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

       通过前面博文的学习,我们知道:没有GPB,客户端的日子很难过,现在略作回顾,没有GPB的日子是这样的: 

 

#include <iostream>
#include <fstream>
using namespace std;int main()
{	int id = 123456; // 字段idchar str[] = "hello world"; // 字段str// 服务端:把数据写到"log服务器"中fstream output("log", ios::out | ios::trunc);output << id << endl;output << str;output.close();int _id;char line[100];memset(line, sizeof(line), 0);// 客户端:从"log服务器"中读取数据fstream input("log", ios::in);input.getline(line, sizeof(line));_id = atoi(line); // (转换要求:客户端必须详尽了解服务端数据格式)cout << _id << endl;memset(line, sizeof(line), 0);input.getline(line, sizeof(line));cout << line << endl;input.close();return 0;
}

 

       在本文中,我们来看看有了GPB后,日子是怎样的?程序如下:

 

/*说明:1:如果你直接将下面程序拷贝过去,那么一定会出现编译错误,因为还需要其它文件的配合。在本文中,我暂时仅给出这个简单的程序,目的是为了说明Google Protocol Buffer的方便之处。2:在后续的介绍中,我会把相关方法和文件给大家,到时候,大家就可以正确地运行该程序了,真正体会到Google Protocol Buffer的方便之处,敬请期待。
*/#include <iostream>
#include <fstream>
#include "test.pb.h"
#pragma comment(lib, "libprotobuf.lib")
using namespace std;int main()
{int stuID = 123456;char stuName[] = "hello world";// 服务端:把数据序列化到"log服务器"中lm::student stu1;stu1.set_id(stuID);stu1.set_str(stuName);fstream output("./log", ios::out | ios::trunc);stu1.SerializeToOstream(&output); // 序列化output.close();// 客户端:将"log服务器"中的数据反序列化lm::student stu2;fstream input("./log", ios::in);stu2.ParseFromIstream(&input);   // 反序列化int theID = stu2.id();           // 读取数据就是这么简单,爽歪歪string theName = stu2.str();     // 读取数据就是这么简单,爽歪歪input.close();cout << theID << endl;cout << theName << endl;return 0;
}

        log文件的内容如下(用文本文件方式打开):

          控制台上的结果为:

 

        我们可以看到,运用GPB机制后,客户端取数据非常简单,不用关心待解析的数据的具体格式,只需傻瓜式地取数据即可,这就是运用GPB后的效果。那么,什么是GPB呢?

 

     千言万语抽象成一句话:GPB就是一种编解码机制(序列化反序列化机制),可以方便你我。

 

        通过上面的介绍,我们终于懂了GPB是什么了,如果你还需要更全面地了解GPB,请参阅:

        wikipedia的相关介绍:http://en.wikipedia.org/wiki/Protocol_Buffers

        google的相关介绍    :https://developers.google.com/protocol-buffers/docs/overview

在随后的博文中,我们将详尽地介绍如何使用GPB, 敬请期待。

 

 

 

这篇关于Google Protocol Buffer(GPB)使用之完全解析二:有了GPB的日子怎么过?什么是GPB?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/684837

相关文章

Python包管理工具核心指令uvx举例详细解析

《Python包管理工具核心指令uvx举例详细解析》:本文主要介绍Python包管理工具核心指令uvx的相关资料,uvx是uv工具链中用于临时运行Python命令行工具的高效执行器,依托Rust实... 目录一、uvx 的定位与核心功能二、uvx 的典型应用场景三、uvx 与传统工具对比四、uvx 的技术实

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

LiteFlow轻量级工作流引擎使用示例详解

《LiteFlow轻量级工作流引擎使用示例详解》:本文主要介绍LiteFlow是一个灵活、简洁且轻量的工作流引擎,适合用于中小型项目和微服务架构中的流程编排,本文给大家介绍LiteFlow轻量级工... 目录1. LiteFlow 主要特点2. 工作流定义方式3. LiteFlow 流程示例4. LiteF

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

Java中Map.Entry()含义及方法使用代码

《Java中Map.Entry()含义及方法使用代码》:本文主要介绍Java中Map.Entry()含义及方法使用的相关资料,Map.Entry是Java中Map的静态内部接口,用于表示键值对,其... 目录前言 Map.Entry作用核心方法常见使用场景1. 遍历 Map 的所有键值对2. 直接修改 Ma

MySQL 衍生表(Derived Tables)的使用

《MySQL衍生表(DerivedTables)的使用》本文主要介绍了MySQL衍生表(DerivedTables)的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学... 目录一、衍生表简介1.1 衍生表基本用法1.2 自定义列名1.3 衍生表的局限在SQL的查询语句select