protobuf (java应用实例)

  1. 简介:

protobuf是Google开源的一种数据传输协议,类似于XML、JSON等技术,优点是protobuf序列化和反序列化的性能非常好,灵活,高效,自动,跨平台,跨语言,最主要的是它的代码生成机制。只要写一个.proto数据文件,再用编译器编译一下,可以编译成对应语言的代码。本文基于java语言。

安装:
去这里下载对应语言的protobuf,解压。

如果你是Windows环境,则还要下载多一个东西。protobuf-2.5.0-windows.zip。

解压protobuf-2.5.0-windows.zip,把protoc.exe放在Protobuf安装目录下的src里,即可。

  1. 简单实例:

1.新建maven项目,引入maven坐标:

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

2.新建.proto文件 ,addressBook.proto

syntax = "proto2";

option java_package = "inesv.proto";
option java_outer_classname = "AddressBookProtos";
message Person {
  required string name = 1;
  required int32 id = 2;
  optional string email = 3;

  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }

  message PhoneNumber {
    required string number = 1;
    optional PhoneType type = 2 [default = HOME];
  }

  repeated PhoneNumber phones = 4;
}

message AddressBook {
  repeated Person people = 1;
}

3.编译:
编译有两种方式:

1).直接进入proto的src目录,打cmd命令:

 protoc.exe -I=proto的输入目录 --java_out=java类输出目录 proto的输入目录包括包括proto文件

2).通过java的Runtime编译:编写 GenerareClass.class(这里是处理所有.proto文件)

package inesv.proto;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class GenerareClass {
    public static void main(String[] args) throws IOException {
        String protoPath = System.getProperty("user.dir") + "\\src\\main\\resources\\proto";
        List<String> protoFileList = new ArrayList<String>();
        File f = new File(protoPath);
        File fa[] = f.listFiles();
        for (int i = 0; i < fa.length; i++) {
            File fs = fa[i];
            if (fs.isFile()) {
                protoFileList.add(fs.getName());
            }
        }
        for (String protoFile : protoFileList) {
            System.out.println(protoFile);
            
            String strCmd = "D:/file/blockChain/protobuf-java-3.5.1/protobuf-3.5.1/src/protoc.exe --java_out=../../java " + protoFile;
            Runtime.getRuntime().exec(strCmd, null, new File(protoPath));
        }
    }
}

到这里,一个proto简单例子就完成了。接下来详细讲解。。

4.对.proto文件详解:

syntax : 指定协议版本
java_package :编译后java文件存放的包
java_outer_classname : 编译生成的java文件名
这个一个地址簿的例子,AddressBook是一个message,而地址簿中又可以嵌套其他message,
message中字段的定义格式为:

修饰符 类型 字段名 = 唯一标识;

修饰符有三种:
required – 表示消息的发送方和接受方都必须处理的字段,此修饰符应该慎用,因为这不利于后期代码的兼容性,比如我们把name字段定义为required,那么接受方必须处理这个属性,如果后期由于业务需要,name字段不要,那么所有接受方都要修改代码,而如果设置为其他修饰符,就不会有这种情况。
optional – 可选
repeated --可多选
类型有:
这里写图片描述

唯一标示:字段名后边的数值为该字段的唯一标示,不能重复.

5.序列化反序列化

package inesv.proto;

import com.google.protobuf.InvalidProtocolBufferException;

import inesv.proto.AddressBookProtos.AddressBook;
import inesv.proto.AddressBookProtos.AddressBook.Builder;
import inesv.proto.AddressBookProtos.Person;
import inesv.proto.AddressBookProtos.Person.PhoneNumber;
import inesv.proto.AddressBookProtos.Person.PhoneType;

public class protoTest {

	public static void main(String[] args) throws InvalidProtocolBufferException {
        
		Person person = Person.newBuilder()
				               .setId(1)
				               .setName("lin")
				               .setEmail("245393886@qq.com")
				               .addPhones(PhoneNumber.newBuilder().setNumber("15218612888")
				            		                              .setType(PhoneType.WORK))
				               .build();
		AddressBook addressBook = AddressBook.newBuilder()
				                         .addPeople(person)
				                         .build();
		//序列化之前
		System.out.println("序列化之前  "+addressBook.toString());
		
		//序列化
		byte[] addressBook_se = addressBook.toByteArray();
		System.out.println("序列化  " + addressBook_se);
		
		
		//反序列化
		AddressBook AddressBook_de = AddressBook.parseFrom(addressBook_se);
		System.out.println("反序列化 " + AddressBook_de);
		
		
	}

}

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Protobuf 是一种由 Google 开发的用于序列化结构化数据的协议。Protobuf Java API 是用于在 Java 中操作和使用 Protobuf 的开发者接口。 Protobuf Java API 提供了一种简单而高效的方式来处理和管理 Protobuf 数据。使用 Protobuf Java API,开发者可以定义数据模型,将数据序列化成二进制格式,并可以将二进制数据反序列化为对象实例。 通过 Protobuf Java API,开发者可以轻松地创建 Protobuf 消息,定义消息字段和类型,并根据自己的需求对消息进行定制。API 还提供了一些实用的方法,例如对消息进行合并、拷贝和克隆。开发者还可以使用 API 将消息序列化为二进制数据,并通过网络传输或存储到磁盘等介质中。 使用 Protobuf Java API 还可以实现高效的数据交互。由于 Protobuf 的数据结构紧凑且二进制化,相比于 XML 和 JSON 等文本格式,Protobuf 可以显著减少数据的大小,从而减少网络传输的负载和提高传输效率。在需要对大量数据进行交换和处理的场景中,Protobuf Java API 可以提供快速和高效的数据序列化和反序列化功能。 此外,Protobuf Java API 还支持版本兼容性。当数据结构发生变化时,可以使用 Protobuf Java API 进行兼容升级,而无需更改现有的代码和数据格式。这样可以保持系统的平滑过渡和持续演进,减少了对系统的影响和维护成本。 总之,Protobuf Java API 提供了一种强大且灵活的方式来处理和管理结构化数据。它简化了数据的序列化和反序列化过程,提供了高效的数据交互方式,并支持版本兼容性。无论是在网络通信、分布式系统、大数据处理还是移动应用开发等领域,Protobuf Java API 都是一种非常有用的工具。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值