我是靠谱客的博主 冷艳洋葱,最近开发中收集的这篇文章主要介绍java protocol demo_Protocol Buffers(protobuf)java初体验,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

由于项目需要所以简单的研究了下protobuf。我也是参照网上的博客,所以大部分内容我也就不重复造轮子了。首先protobuf介绍点击这里,使用介绍点击这里,使用demo看这里。我个人的第一个例子也是参照这个demo来的,不过其中我有遇到一些问题,所以揪出来说说,也就给自己做个笔记,方便查阅。

基本的东西相信大家也了解了,直接步入主题了:

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

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

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

③、repeated可重复的字段可以用来表示数组,在这里我还小小的纠结了会,搞过去就好了(纠结了好一会才知道protobuf数组怎么定义)。其实定义数组很简单repeated

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 values = new ArrayList();

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到底是干什么的,直到我把整个流程跑通了后才理解,它就是一个封装数据(二进制)协议,通过这样的方式封装数据更小,效率更高

原文:http://blog.csdn.net/yangxin_540/article/details/29808091

最后

以上就是冷艳洋葱为你收集整理的java protocol demo_Protocol Buffers(protobuf)java初体验的全部内容,希望文章能够帮你解决java protocol demo_Protocol Buffers(protobuf)java初体验所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部