因为项目须要所以简单的研究了下protobuf。我也是參照网上的博客,所以大部分内容我也就不反复造轮子了。首先protobuf介绍点击这里,使用介绍点击这里,使用demo看这里

我个人的第一个样例也是參照这个demo来的。只是当中我有遇到一些问题,所以揪出来说说,也就给自己做个笔记,方便查阅。

主要的东西相信大家也了解了。直接步入主题了:

1、限定修饰符介绍 required\optional\repeated,之前给定的博客已经有这个介绍了我也不多说。这里把一些小玩儿拿出来讲讲

①、required必须的字段,假设不赋值就会抛出 com.google.protobuf.UninitializedMessageException: Message missing required fields: ...异常

②、optional可选字段,没什么好说的就是可有可无咯

③、repeated可反复的字段能够用来表示数组,在这里我还小小的纠结了会,搞过去就好了(纠结了好一会才知道protobuf数组怎么定义)。事实上定义数组非常easyrepeated
string name=字段号;然后在赋值的刚開始用数组的形式来赋值,会抛出java.lang.IndexOutOfBoundsException: Index: 0, Size: 0的异常,我在想size为0,也就是说不能这样搞呀,然后看了下源代码是com.google.protobuf.LazyStringList name_ = com.google.protobuf.LazyStringArrayList.EMPTY这种,也就是说这个玩儿就是个集合嘛。所以赋值就用集合那套来搞定好了

2、接下来就是正式開始了,首先准备所以须要的protoc.exe和protobuf的jar包。下载点击这里。没什么好配置的。所以開始吧。

①、首先编写一个proto文件,这里我的文件是test.proto

package protobuf;
option java_package = "com.test.protobuf";
option java_outer_classname = "FirstProtobuf";
message testBuf {
required int32 ID = 1;
optional string Url = 2;
repeated string name=3; enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
}

定义包名什么的就没什么好说的了。

option
java_outer_classname = "FirstProtobuf";定义生成类的名字

message
testBuf定义一个message内部类基本的字段什么就在这里面了

required
int32 ID = 1; 定义字段,每一个字段都必须有一个唯一的字段号,由于我也是初体验所以也不知道这个字段号究竟有什么用,可是不写编译就会出Missing field number的错,反复就会出Field number 1 has already been used in "protobuf.testBuf" by field "....".的错

②、将文件放在解压的protoc.exe同级文件夹下

③、就该编译了,我这里依照网上说的(protoc.exe --java_out=./test.proto)编译出现了问题Missing input file.然后查了下问题解决,查看原文,所以用protoc ./test.proto
--java_out=./命令编译通过

④、把生成的文件拷到新建的java文件夹下,然后把jar拷贝进来build path下

⑤、開始測试

序列号数据(封装数据)

public static void main(String[] args) {
FirstProtobuf.testBuf.Builder builder = FirstProtobuf.testBuf.newBuilder();
builder.setID(777);
builder.setName(0, "");
List<String> values = new ArrayList<String>();
values.add("aaa");
values.add("aba");
values.add("baa");
values.add("acc");
builder.addAllName(values); FirstProtobuf.testBuf info = builder.build();
byte[] result = info.toByteArray();
System.out.println(result.toString());
TestAlone.getData(result);
}

反序列化数据

public static void getData(byte[] result) {
try {
FirstProtobuf.testBuf testBuf = FirstProtobuf.testBuf.parseFrom(result);
System.out.println(testBuf);
System.out.println(FirstProtobuf.testBuf.PhoneType.HOME);//这里使用枚举
} catch (InvalidProtocolBufferException e) {
e.printStackTrace();
}
}

好了,到这里初体验完,事实上不难的,我刚開始时一直没有理解这个protobuf究竟是干什么的,直到我把整个流程跑通了后才理解,它就是一个封装数据(二进制)协议,通过这种方式封装数据更小,效率更高

protobuf(Protocol Buffers)java初体验的更多相关文章

  1. protobuf Protocol Buffers 简介 案例 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  2. Protocol Buffers java

    Protocol Buffers https://developers.google.cn/protocol-buffers/ 一. 例 addressbook.proto. syntax = &qu ...

  3. Java初体验

    参考书籍「Java语言程序设计基础篇」 比特与字节 计算机中只有0和1,二进制,即比特(bit,二进制数): 字节(byte)是最小的存储单元,每个字节有8个比特组成 即:1byte=8bit 各种数 ...

  4. protobuf初体验

    概念介绍 Protocol buffers 是google公司的与语言无关.与平台无关的.可扩张的为序列化话结构数据,就像xml一样,办事更加的小巧.快速.简单.Protocol buffers 目前 ...

  5. .NET Core 微服务之grpc 初体验(干货)

    Grpc介绍 GitHub: https://github.com/grpc/grpc gRPC是一个高性能.通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计 ...

  6. google protobuf初体验

    最近在读别人代码的时候发现一个的东西,名字叫protobuf, 感觉挺好用的,写在这里,留个记录.那么什么是protobuf 呢?假如您在网上搜索,应该会得到类似这样的文字介绍: Google Pro ...

  7. java&Protocol Buffers

    ps: Protocol Buffers简称PB PB 安装配置 下载 PB: 在 PB 官网,下载最新版(或者其他版本)PB,这里为了与 Java 项目中的 PB Maven 依赖版本一致,使用 P ...

  8. Protocol Buffers(Protobuf) 官方文档--Protobuf语言指南

    Protocol Buffers(Protobuf) 官方文档--Protobuf语言指南 约定:为方便书写,ProtocolBuffers在下文中将已Protobuf代替. 本指南将向您描述如何使用 ...

  9. Protocol Buffers(Protobuf)开发者指南---概览

    Protocol Buffers(Protobuf)开发者指南---概览 欢迎来到protocol buffers的开发者指南文档,protocol buffers是一个与编程语言无关‘.系统平台无关 ...

随机推荐

  1. 我的Python成长之路---第一天---Python基础(5)---2015年12月26日(雾霾)

    六.流程控制 与C语言不通的事Python的流程控制的代码块不是用{}花括号表示的,而是用强制缩进来,而且缩进必须一致,官方推荐是使用4个空格,不建议使用使用tab(制表符)做缩进,一是不同的系统ta ...

  2. mac忘记登陆密码解决

    重新启动苹果电脑,开机时按住“command”键+“S”键,(普通键盘按住win+s)会进入单用户模式, 出现像DOS一样的提示符 #root>依次输入如下三个命令:(注意空格 注意大小写) f ...

  3. X窗口系统名词解释

    前端时间Gentoo的桌面环境出了点问题,发现自己对Linux的桌面环境了解的很少,于是恶补了一下知识,以下名词解释基本上都是来自维基百科的条目和<Linux程序设计(第三版)>.一般而言 ...

  4. 相邻数字的基数不等比:skew数

    2973:Skew数 描述在 skew binary表示中, 第 k 位的值xk表示xk*(2k+1-1). 每个位上的可能数字是0 或 1,最后面一个非零位可以是2, 例如, 10120(skew) ...

  5. perl 读取cookie

    use LWP::UserAgent; use HTTP::Date qw(time2iso str2time time2iso time2isoz); use Net::Ping; use Sock ...

  6. date、datetime、string的相互转换

    import datetime import time string转datetime str = '2012-11-19' date_time = datetime.datetime.strptim ...

  7. 趋势科技4月移动client病毒报告

    2014年4月移动client安全威胁概况 截至2014年4月30日,中国区移动client病毒码1.669.60,大小9,792,484字节,能够检測病毒约221万个.移动client病毒约12万个 ...

  8. Qt读取ANSI格式文件——利用QTextCodec将其他编码格式的QByteArray转换为Unicode格式,或者从文件中读出后直接做转换

    t使用Unicode来表示字符串.但是通常需要访问一些非Unicode格式的字符串,例如打开一个GBK编码的中文文本文件,甚至一些非Unicode编码的日文,俄文等. Qt提供了QTextCodec类 ...

  9. OpenGL教程之新手上路

    Jeff Molofee(NeHe)的OpenGL教程- 新手上路 译者的话:NeHe的教程一共同拥有30多课,内容翔实,而且不断更新 .国内的站点实在应该向他们学习.令人吃惊的是,NeHe提供的例程 ...

  10. 谈论Java原子变量和同步的效率 -- 颠覆你的生活

    我们认为,由于思维定式原子变量总是比同步运行的速度更快,我想是这样也已经,直到实现了ID在第一次测试过程生成器不具有在这样一个迷迷糊糊的东西. 测试代码: import java.util.Array ...