Protocol Buffers 浅析

从Starlink看NTN:SSB波束数量少,用户体验真的会差吗? 当SpaceX的Starlink以每月新增上百颗卫星的速度扩张其星座时,一个有趣的技术现象正在引发行业讨论:为何这个全球最大的低轨卫星网络选择使用相对较少的波束数量?波束数量的选择远非简单的技术参数,而是系统设计哲学、商业策略与终端用户体验的复杂平衡。传统地面网络可以依赖密集基站实现精准覆盖,而卫星通信必须面对一个根本性挑战:如何在数百公里的高空,用有限的射频资源服务广阔的地理区域。当我们在撒哈拉沙漠测试不同波束方案时,发现了一个关键洞见:最佳波束数量不是固定的技术参数,而是随网络发展阶段变化的动态值。 阅读详情

###简介

Protocol Buffers(简称protobuf)是谷歌的一项技术,用于将结构化的数据序列化、反序列化,经常用于网络传输。
这货实际上类似于XML生成和解析,但protobuf的效率高于XML,不过protobuf生成的是字节码,可读性比XML差。类似的还有json、Java的Serializable等。
详细了解可以参考Protocol Buffers,接下类将介绍一些基本的使用步骤。

###使用

首先通读Protocol Buffers,了解.proto文件的基本格式和写法,下载官方给我们准备的工具,通过该工具可以将.proto文件直接生成需要的代码源文件(比如Java/C/C++/Python等等),接下来直接将该源文件放到工程目录中,编写相应的序列化和反序列化等,这样就完成了整个流程,下面给出简单的实现步骤。

####.proto文件
time.proto

option java_package = "com.test.app.pb.common";
option java_outer_classname = "TimeProto";

message Time {
	optional int32 id = 1;
	optional int32 startTime = 2;
	optional int32 endTime = 3;
	optional int64 systemTime = 4;
	optional string countDownTip = 5;
	optional int32 sEffectiveTime = 6;
	optional int32 eEffectiveTime = 7;
	optional string  startTip = 8;
	optional string	endTip = 9;
}

上面的1、2、3、4是unique numbered tag,是一个唯一标识。这也是整个编码中的亮点,想一探究竟的可以继续往下看。
####通过工具生成代码
protoc工具使用的一般格式是:

protoc -I=$SRC_DIR --java_out=$DST_DIR $SRC_DIR/xxx.proto
protoc -I=$SRC_DIR --cpp_out=$DST_DIR $SRC_DIR/xxx.proto

其中SRC_DIR是proto文件所在的目录,DST_DIR是编译proto文件后生成的结构体处理文件的目录

之后会生成对结构体time.proto中描述的各字段做序列化反序列化的类。
工具命令如下:
此处输入图片的描述
生成的java代码
此处输入图片的描述
####写测试代码
将上面生成的代码加入到工程中去,再将Jar包导入工程中,或者添加如下Maver依赖

<dependency>  
    <groupId>com.google.protobuf</groupId>  
    <artifactId>protobuf-java</artifactId>  
    <version>2.6.1</version>  
</dependency>  

接下来写测试代码
####序列化代码(发送方)

TimeProto.Time.Builder timeBuilder = TimeProto.Time.newBuilder();
        
        timeBuilder.setEEffectiveTime(20160428)
                   .setEndTime(20160429)
                   .setEndTip("End")
                   .setSEffectiveTime(20160428)
                   .setStartTime(20160426)
                   .setStartTip("Start")
                   .setSystemTime(20160428);
        
        TimeProto.Time time = timeBuilder.build();
        ByteArrayOutputStream output = new ByteArrayOutputStream();  
        
        try {
            time.writeTo(output);
        } catch (IOException e) {
            e.printStackTrace();
        }

####反序列化(接收方)

try {
    HttpClient httpClient = new DefaultHttpClient();
    url = NetworkUtils.getCompleteUrl(url, getParams);
    HttpGet request = new HttpGet(url);
    HttpResponse response = httpClient.execute(request);
    ByteArrayBuffer buffer = new ByteArrayBuffer(32 * 1024);
    InputStream in = null;
    try {
        HttpEntity entity = response.getEntity();
        if (entity == null) {
        } else {
            in = response.getEntity().getContent();
        }
        int temp;
        byte[] bytes = new byte[8096];
        while ((temp = in.read(bytes)) != -1) {
            buffer.append(bytes, 0, temp);
        }
    } catch (SocketTimeoutException e) {
        throw new HttpException(HttpException.MSG_NETWORK_ERROR, e);
    } catch (IOException e) {
        throw new HttpException(HttpException.MSG_NETWORK_ERROR, e);
    } finally {
        if (in != null) {
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
    byte[] result = buffer.toByteArray();
    try {
        TimeProto.Time timeResp = TimeProto.Time.parseFrom(result);
    } catch (InvalidProtocolBufferException e) {
        e.printStackTrace();
    }
} catch (SocketTimeoutException e) {
    throw new HttpException(HttpException.MSG_NETWORK_ERROR, e);
} catch (IllegalStateException e) {
    throw new HttpException(HttpException.MSG_NETWORK_ERROR, e);
} catch (IOException e) {
    throw new HttpException(HttpException.MSG_NETWORK_ERROR, e);
}

关键的逻辑在L33到L35行,拿到字符数组以后直接parse出来。

参考文档:
Protocol Buffers 官方文档
Java使用Protocol Buffers入门四步骤 如何使用
google protobuf源码分析1源码分析
Protocol Buffer技术详解(Java实例) 如何使用
玩转Protocol Buffers 如何使用
Google Protocol Buffer 的使用和原理 原理和使用
Why Protocol Buffer So Fast? ----protobuf编码详解 原理和使用
Protocol Buffers编码详解,例子,图解 原理和使用

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版 Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。 立即下载

相关推荐

深信服上网行为管理设备登录方法、恢复出厂、恢复控制台密码

1.初识设备 1.1 设备外观 1.2 软件版本 2.如何登录设备 首次拿到AC/SG设备时,可以通过以下方法登录设备控制台 SANGFOR AC/SG设备,各网口默认的出厂IP为: eth0(LAN):10.251.251.251/24 , eth1(DMZ)10.252.252.252/24 1、使用一根交叉线连接设备和电脑 (1) 如果电脑连接的是设备的eth0口,需先在电脑上配...

✍千里之行,始于足下 ^,^ 5万+

微信小程序websocket使用protobuf,发送arraybuffer

小程序中使用websocket,区分房间、空间现在遇到了一个需求是小程序接入 io-game 的websocket 和unity 游戏端同时使用一个websocket,io-game那边收发websocket消息都是采用 Protobuf 处理的。//加载awesome.proto对应的json var Login = protobuf . Root . fromJSON(loginConfig);//这就是我们的Message类。

Codernmx 4552

新手必看:如何用R/qtl快速完成QTL定位分析(附实战代码)

本文为新手提供了使用R/qtl进行QTL定位分析的完整实战指南。内容涵盖从环境搭建、数据准备与清洗,到核心分析流程(包括遗传图谱计算、单QTL扫描、置换检验确定阈值)以及进阶结果可视化的全步骤。通过清晰的代码示例,帮助读者快速掌握这一数量遗传学关键分析技术,实现从数据到QTL峰值的完整分析闭环。

y7z8a的博客 498

caffe数据格式(Google Protocol Buffers)

caffe该不该看底层的代码,看个人兴趣,个人觉得是一个设计的非常好的平台,值得学习学习。不知道从哪方面开始学习,caffe用到的知识太多了,对于我这样的新手基本一个配置就搞得头疼啊,接触了这么久caffe,打算开始学习一下caffe的源码了。那就先从数据格式开始学习喽。 找了很久资料,终于找到一个比官网容易学习的博文。按照博文介绍一步步理解了。 =======================

深藏功与名 7397

802.1x之EAP-TLS测试方法

CA证书一般是由权威的认证机构发出,用来验证该机构签名的证书,持有CA证书的设备可以验证对端的证书是否由自己信任的机构颁发的。在我们内部使用证书时,我没可以自己充当CA认证机构,管理私钥和CA证书,使用他们签名服务器、客户端证书。2、使用证书请求文件server_csr.pem、CA私钥、CA公钥生成服务器证书(正常情况下自己不拥有CA私钥,是把证书请求文件发给认证机构,由认证机构返回证书)进行802.1x EAP-TLS认证时需要IPC、服务器分别存储CA证书、设备证书、私钥,通过交换证书实现身份验证。

写作是为了更好的思考 2163

Blender软件导出地形到Gazebo中

Blender软件导出地形到Gazebo中,并配置纹理、刚度、高度。

m0_70652514的博客 3376

程序包开发,读简单配置文件 v1

服务计算Homework04 项目地址 使用说明: 任务目标 熟悉程序包的编写习惯(idioms)和风格(convetions) 熟悉 io 库操作 使用测试驱动的方法 简单 Go 程使用 事件通知 任务内容 在 Gitee 或 GitHub 上发布一个读配置文件程序包,第一版仅需要读 ini 配置,配置文件格式案例: # possible values : production, development app_mode = development [paths] # Path to

Edith的博客 452

R语言笔记三:矩阵、数组、列表和数据框

1.矩阵        矩阵是二维的,需要有行和列。向量是一维的。        在R软件中,矩阵是有维数的向量,这里的矩阵元素可以是数值型、字符型或者逻辑型,但是每个元素必须拥有相同的模式,这个和向量一致。 (1)创建矩阵: m <- matrix(1:20,4,5) 行数和列数的分配必须满足分配条件。若分配的行列过大,分配的元素不足够,则报错。 m <-

weixin_44384631的博客 6210

WebSocket中关于使用ProtoBuf传输数据介绍js部分

WebSocket中关于使用ProtoBuf传输数据介绍js部分

记事本 2万+

AWD线下攻防赛总结

在本地组策略编辑器里面,依次展开计算机配置—>管理模板—>Windows组件—>远程桌面服务—>远程桌面会话主机—>连接—>限制连接的数量。8.Web目录环境查找相关可疑文件:jpg/png/rar,属性、解压。进程线程:netstat / ps -aux/netstat -apt。4.查看/etc/init.d/rc.local中启动服务有无异常。1.不使用默认口令,修改成复杂的,并确保和web环境连接。5.使用脚本开启进程监控、目录监控、流量监控。文件操作监控.exe/御剑文件监控.exe。

XuJL89的博客 630

WinCC 7.5 读取 SQL server2016 中的表格数据

环境 win10 SQL Server 2016 WinCC V7.5 SP2 1 安装SQL Server 2016 2 选择服务器名称 .\WINCC 3 建数据库

skr? 7140

Google Protocol Buffers浅析

本文主要偏向于介绍怎么使用Google的Protocol Buffer技术来压缩与解析你的数据文件,更加详细的信息请参阅Google开放的开发者网页文档,地址为:http://code.google.com/apis/protocolbuffers/docs/overview.html。 一、简单的介绍 当然,在继续本文之前,读者还是需要对Google Pr...

dizhi5320的博客 123

人工蜂鸟算法(AHA)详解:原理、实现与应用

人工蜂鸟算法(AHA)是一种受蜂鸟飞行技能和觅食策略启发的新型元启发式优化算法。该算法模拟蜂鸟的全向飞行、记忆能力和觅食行为,通过引导觅食、领地觅食和迁徙觅食三种策略在解空间高效搜索。AHA将优化问题解类比为食物源,蜂鸟作为搜索代理,利用访问表记录访问信息。算法核心包括三种飞行技能建模(全向、对角线和轴向飞行)以及对应的数学公式实现。Python实现展示了种群初始化、适应度计算和觅食行为模拟等关键步骤。AHA以其高效的全局搜索能力、良好收敛性和鲁棒性,在复杂优化问题中表现优异。

qq_42212808的博客 904

Google Protocol Buffers浅析(二)

本文开始将逐渐介绍怎么使用protocol buffers来完成序列化与反序列化数据的应用,开发环境为VS2008,语言为C++,外部库用的是googlebuffer库。       1、Google Protocol Buffer库       在我们的应用程序里面,需要使用到google buffer提供的库,大家可以到官网去下载,笔者也会提供一个精简后的Win32 Release

hq20000的专栏 1232

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Google Protocol Buffers浅析(三)

Google Protocol Buffers浅析(三) 2010年11月02日   本文主要会介绍怎么使用Google Protocol的Lib来序列化我们的数据,方法很多种,本文只介绍其中的三种,其他的方法读者可以通过自行研究摸索。但总的来说,序列化数据总的来说分为以下俩步:   1)使用数据源填充数据结构,无论数据源来自文件还是内存还是标准输入   2)利用Lib提供的序列...

wjqcx29o 182

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Google Protocol Buffers浅析(一)

本文主要偏向于介绍怎么使用Google的Protocol Buffer技术来压缩与解析你的数据文件,更加详细的信息请参阅Google开放的开发者网页文档,地址为:http://code.google.com/apis/protocolbuffers/docs/overview.html 。      一、简单的介绍      当然,在继续本文之前,读者还是需要对Google Protocol

xiaofengkuang的专栏 7958

Google Protocol Buffers浅析(三)

<br /> 本文主要会介绍怎么使用Google Protocol的Lib来序列化我们的数据,方法很多种,本文只介绍其中的三种,其他的方法读者可以通过自行研究摸索。但总的来说,序列化数据总的来说分为以下俩步:<br />     1)使用数据源填充数据结构,无论数据源来自文件还是内存还是标准输入<br />     2)利用Lib提供的序列化接口将数据结构序列化,然后存储在内存或者磁盘上<br />  一、填充数据结构  <br />     从数据源中获取数据,这儿的数据源可能来自磁盘上的一个文件或

很不错的 blog 1454

Google Protocol Buffers浅析(四)

本文作为结束篇,会稍微介绍下怎么反序列化GoogleBuffer数据,并在最后提供本系列文章中所用到的代码整理供下载。      上一篇文章介绍了怎样将数据序列化到了addressbook.data中,那么对于接受方而言该怎么解析出原本的数据呢。同样,protoc编译器生成的代码文件中提供了反序列化的接口,基本上和序列化的函数对应的,如下图所示:               上文

shanshu12的专栏 754
上一篇: MVX Android设计架构浅析
下一篇: 深入理解Java序列化
linroidh
博客等级 码龄16年 15粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值