protobuf菜鸟教程

Python010

protobuf菜鸟教程,第1张

一:环境安装

1 安装brew

ruby -e "$(curl -fsSL  https://raw.githubusercontent.com/Homebrew/install/master/install)"

2 使用brew安装protobuf

brew install protobuf

3 查看protoc版本

protoc --version

4 查看protobuf版本

brew search protobuf

二:示例

gps_data.proto

syntax = "proto3"

option java_package = "com.dongwt.proto"

message gps_data {

int64 id = 1

string terminalId = 2

string dataTime = 3

double lon = 4

double lat = 5

float speed = 6

int32 altitude = 7

int32 locType = 8

int32 gpsStatus = 9

float direction = 10

int32 satellite = 11

}

执行命令

protoc -I=src/main/resources/proto --java_out=src/main/java gps_data.proto

三:pom依赖(版本号序号protoc版本保持一致)

<dependency>

    <groupId>com.google.protobuf</groupId>

    <artifactId>protobuf-java</artifactId>

    <version>3.17.3</version>

</dependency>

四:单侧

public class TestGpsProtobuf {

public static void main(String[] args) {

System.out.println("===== 构建一个GPS模型开始 =====")

        GpsData.gps_data.Builder gps_builder = GpsData.gps_data.newBuilder()

        gps_builder.setAltitude(1)

        gps_builder.setDataTime("2017-12-17 16:21:44")

        gps_builder.setGpsStatus(1)

        gps_builder.setLat(39.123)

        gps_builder.setLon(120.112)

        gps_builder.setDirection(30.2F)

        gps_builder.setId(100L)

        GpsData.gps_data gps_data = gps_builder.build()

        System.out.println(gps_data.toString())

        System.out.println("===== 构建GPS模型结束 =====")

        System.out.println("===== gps Byte 开始=====")

        for(byte b : gps_data.toByteArray()){

System.out.print(b)

        }

System.out.println("\n" +"bytes长度" + gps_data.toByteString().size())

        System.out.println("===== gps Byte 结束 =====")

        System.out.println("===== 使用gps 反序列化生成对象开始 =====")

        GpsData.gps_data gd =null

        try {

gd = GpsData.gps_data.parseFrom(gps_data.toByteArray())

        }catch (InvalidProtocolBufferException e) {

e.printStackTrace()

        }

System.out.print(gd.toString())

        System.out.println("===== 使用gps 反序列化生成对象结束 =====")

    }

}

浏览器和JS并不直接处理数据--尤其是遇到内部服务时。我的观点是,结构化格式,例如谷歌的Protocol Buffers,是一个比JSON在编码方面更好的选择。如果你从来没有使用过Protocol Buffers,你可以参看 这里。不要担心,在说明为什么要选择Protocol Buffers而不是JSON之前,本文会简介如何使用在Ruby上使用它 。

Protocal Buffers的简短介绍

首先,什么是Protocol Buffers?文档中说:

“Protocol Buffers是一种以有效并可扩展的格式编码结构化数据的方式。”

Google开发了Protocol Buffers使用于内部的服务。 它是一种二进制格式允许你使用规范的语言定义一个模式,例如:

1 message Person {

2 required int32 id = 1

3 required string name = 2

4 optional string email = 3

5 }

你能在命名空间中封装他们或者用上面的方式在顶层声明他们。这个片段定义了Person数据类型的模式,有三个字段:id, name和email。除了命名字段,你能提供一个类型决定数据怎样编码和在线上发送,在上面我们看到有int32类型和string类型。还提供了关键字进行验证和结构化(required 和optional )。字段被编号,这有助于向后兼容,我将在以后详细的介绍。

Protocol Buffers规范已被多种语言实现:Java,C,Go等。如果你四处找找最现代的语言都有实现的方式。Ruby也不例外,有几个不同的Gems使用Protocol Buffers编码和解码数据。这就意味着,这个规范可以在不同语言实现的系统间传递数据。

例如,Ruby Gem安装被称为ruby-protoc的二进制可以和主Protocol Buffers库组合使用(在OSX中brew install protobuf),自动的产生桩类文件用于编码和解码数据。正在运行的二进制proto文件产生以下的Ruby类:

view sourceprint?

01 #!/usr/bin/env ruby

02 # Generated by the protocol buffer compiler. DO NOT EDIT!

03 require 'protocol_buffers'

04

05 # forward declarations

06 class Person <::ProtocolBuffers::Messageend

07

08 class Person <::ProtocolBuffers::Message

09 set_fully_qualified_name "Person"

10

11 required :int32, :id, 1

12 required :string, :name, 2

13 optional :string, :email, 3

14 end

正如你所见,通过支持这种模式(Protocol Buffer格式),用来编码和解码信息,我们就能自动得到一个类(查看代码ProtocolBuffers::Message的基类在Gem中有更多细节的介绍)。我们已经看到了一些信息,那么就让我们再来仔细看看这些特征点,让我尝试说服你考虑Protocol Buffers——这里有5个理由。