pythongoogle.probuf.timestamp_Android技术周报190317期 —— Protocbuf全面解析

本文详细介绍了Google的Protocol Buffers(Protobuf),一种高效的数据序列化方式,对比XML和JSON,Protobuf更小、更快。文章涵盖了Protobuf编译器的安装、Protobuf3语法,包括版本声明、消息定义、枚举、扩展、Any类型、Oneof和Map等内容,并提供了代码示例。此外,还讲解了如何编译Protobuf文件生成不同语言的代码。
摘要由CSDN通过智能技术生成

Protobuf即Protocol Buffers,是Google公司开发的一种跨语言和平台的序列化数据结构的方式,是一个灵活的、高效的用于序列化数据的协议。与XML和JSON格式相比,protobuf更小、更快、更便捷。而且Protobuf是跨语言的,并且自带一个编译器(protoc),只需要用protoc进行编译,就可以编译成Java、Python、C++、C#、Go等多种语言代码,然后可以直接使用,不需要再写其它代码,自带有解析的代码。

一. Protocbuf编译器的安装

从https://github.com/protocolbuffers/protobuf/releases上下载最新的release包,并解压到你的安装目录下,然后将其下面的bin目录添加为系统环境变量,如mac操作系统下:

export PATH=$PATH:/usr/local/protobuf/bin

这样就可以在任意地方的命令行窗口下使用protoc指令,如检查protoc编译器版本:

protoc --version

二. Protocbuf3语法

1. 版本声明

syntax = "proto3";

.proto文件中非注释非空的第一行必须使用Proto版本声明,如果不使用proto3版本声明,Protobuf编译器默认使用proto2版本。

2. Package

package com.aervon.proto;

.proto文件中可以新增一个可选的package声明符,用来防止不同的消息类型有命名冲突。包的声明符会根据使用语言的不同影响生成的代码:

A、对于C++语言,产生的类会被包装在C++的命名空间中。

B、对于Java语言,包声明符会变为java的一个包,除非在.proto文件中提供了一个明确有java_package。

C、对于Go语言,包可以被用做Go包名称,除非显式的提供一个option go_package在.proto文件中。

3. Import

import "google/protobuf/timestamp.proto";

通过import声明符可以引用其他.proto里的结构数据体,如以上声明后就可以使用google.protobuf.Timestamp了。

4. 消息定义

message Person {

string name = 1;

int32 id = 2 [default = 0];

string email = 3;

}

Protobuf中,消息即结构化数据。其中变量的声明结构为:

字段规则 + 字段类型 + 字段名称 + [=] + 标识符 + [默认值]

字段规则有:

required: 结构体必须包含该字段一次

optional: 结构体可以包含该字段零次或一次(不超过一次)

repeated: 该字段可以在格式良好的消息中重复任意多次(包括0),其中重复值的顺序会被保留,相当于数组

PS: 在 proto3 中已经为兼容性彻底抛弃 required

字段类型可以具有以下几种类型,在编译器作用下会自动生成类中的相应类型:

.proto Type

Notes

C++ Type

Java Type

Python Type

Go Type

double

double

double

float

*float64

float

float

float

float

*float32

int32

使用可变长度编码。编码负数的效率低 - 如果你的字段可能有负值,请改用 sint32

int32

int

int

*int32

int64

使用可变长度编码。编码负数的效率低 - 如果你的字段可能有负值,请改用 sint64

int64

long

int/long

*int64

uint32

使用可变长度编码

uint32

int

int/lon

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值