Protocol Buffer for Java快速入门

Protocol Buffer它是谷歌内部用的一种高效的、可扩展的对结构化数据进行编码的格式规范。是一个用来序列化结构化数据的技术,支持多种语言诸如C++、Java以及Python语言,可以使用该技术来持久化数据或者序列化成网络传输的数据。相比较一些其他的XML技术而言,该技术的一个明显特点就是更加节省空间(以二进制流存储)、速度更快以及更加灵活。


一:编写proto文件

Account.proto

package entity;

option java_package = "com.pp.entity";   
option java_outer_classname = "AccountEntity"; 

message Account {
	required int32 id = 1;
        required string account = 2;
        required string password = 3;
	optional string nickname = 4;
	required string sex = 5;
        optional int32 status = 6 [default = 0];
}

在文件定义中,每个字段都有唯一的一个标识符,可以理解为索引,用于识别各个字段
id=1,account=2,password=3等 并不是默认值

默认值可以这样设置:optional int32 status = 6 [default = 0];


备注:限定修饰符 required ,optional ,repeated
required: 表示是一个必须字段,必须相对于发送方,在发送消息之前必须设置该字段的值,对于接收方,必须能够识别该字段的意思。
optional:表示是一个可选字段,可选对于发送方,在发送消息时,可以有选择性的设置或者不设置该字段的值。
repeated:表示该字段可以包含0~N个元素。其特性和optional一样,但是每一次可以包含多个值,在Java里面对应的是java.util.List类型。


二:下载用于生成源代码的程序

我这里下载win版本的,下载地址:https://github.com/google/protobuf/releases

我这里下载最新稳定版 protoc-2.6.1-win32.zip

解压后,执行

protoc.exe --java_out=.  Account.proto

之后会在当前目录生成java的源代码,com.pp.entity目录,拷贝这个目录到ide的src目录


三:运行

首先在项目里面加入protobuf的依赖,注意版本需要和上面下载的保持一致

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

package com.pp.entity;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;

import com.pp.entity.AccountEntity.Account;

public class App {
	/**
	 * 序列化
	 */
	public static void write() throws Exception {
		Account.Builder builder = Account.newBuilder();
		builder.setId(1);
		builder.setAccount("admin");
		builder.setPassword("123456");
		builder.setNickname("Administrator");
		builder.setSex("M");
		
		byte[] info = builder.build().toByteArray();
		try(OutputStream out = new FileOutputStream("d:/tmp/account.bin")){
			out.write(info);
		}
	}
	/**
	 * 反序列化
	 */
	public static void read() throws Exception {
		try(FileInputStream fis = new FileInputStream("d:/tmp/account.bin")) {
			byte[] data = new byte[fis.available()];
			fis.read(data);
			
			Account account = AccountEntity.Account.parseFrom(data);
			System.out.println("id : " + account.getId());
			System.out.println("account : " + account.getAccount());
			System.out.println("password : " + account.getPassword());
			System.out.println("nickname : " + account.getNickname());
			System.out.println("sex : " + account.getSex());
			System.out.println("status : " + account.getStatus());
		}
	}
	
	public static void main(String[] args) throws Exception {
		write();
		read();
	}
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值