netty学习六:第一个protobuf小demo

原创 2017年08月06日 18:08:25

概述


本文介绍google的protobuf框架的环境搭建以及使用它编写一个小demo。


配置proto编译器


如果要在window上使用proto编译器,需要下载针对window的编译器,本文使用的是:

protoc-3.3.0-win32.zip

解压完后,将protoc.exe编译器所在的路径设置到path路径上.

C:\sam\software\protobuf\bin

这点使用window的同学应该非常熟悉,这里不详细描述了。

配置完后可以使用:

protoc -h

验证一下是否配置成功。


引入proto-java包


如果是使用gradle构建的,依赖配置如下:

com.google.protobuf:protobuf-java:3.3.1
com.google.protobuf:protobuf-java-util:3.3.1

到此window使用protobuf的所需的东西已经齐全了。


编写proto文件


protobuf使用.proto文件来描述对象结构体的信息。这里用Student.proto为例子来说明如何定义对象以及对象属性。
Student.proto文件的位置

src/main/java/protobuf/firstdemo/Student.proto

syntax = "proto2";
package protobuf;
option optimize_for=SPEED;
option java_package="protobuf.firstdemo";
option java_outer_classname="ModelInfo";

message Student {
  required string name = 1;
  optional int32 age = 2;
  optional string address = 3;
}

java_package:指定生成的java对象所在的java包;
java_outer_classname:生成的对象的名字,是外层对象,Student是其内部类;
messge:用message来声明对象,这里的message Student表示要生成Student对象;


使用proto编译器生成java对象


protoc –java_out=src/main/java src/main/java/protobuf/firstdemo/Student.proto

首先使用java_out指定对象要生成到哪个位置,java_out指定的参数加上.proto文件中的java_package的参数,
确定了对象生成的完整路径。如本文,对象将生成在

src/main/java/protobuf/firstdemo

指定.proto文件所在的位置。

src/main/java/protobuf/firstdemo/Student.proto

执行完上面的命令后,如果没有报出什么error信息,表示成功了。包里面会多出一个ModelInfo对象。

备注

CSDN的markdown工具老是把两个- 显示成一个-,刚才的java_out命令,前面是两个-。


测试ModelInfo对象


package protobuf.firstdemo;

import com.google.protobuf.InvalidProtocolBufferException;

import protobuf.firstdemo.ModelInfo.Student;

public class ModelInfoTest {

    public static void main(String[] args) throws InvalidProtocolBufferException {
        Student student = ModelInfo.Student.newBuilder()
                         .setName("Sam")
                         .setAge(34)
                         .setAddress("广州")
                         .build();

        //转换成字节数组,而字节数组就可以在网络上传输了
        //比如说:从客户端传输到服务端,从服务端传输到客户端
        byte[] byteArray = student.toByteArray();

        //从字节数组中反序列成对象
        Student student2 = ModelInfo.Student.parseFrom(byteArray);
        System.out.println(student2.getName());
        System.out.println(student2.getAge());
        System.out.println(student2.getAddress());  
    }
}

这段代码简单的演示了将对象变成字节数组以及从字节数组中反序列化成java对象。


总结


通过protobuf的编译器(版本2),基于proto文件,可以生成用于在网络上传输的对象,但是并没有生成编写客户端服务端代码的api类。实际上proto2是无法生成客户端和服务端代码的,这个只能使用基于proto3的grpc才能做到。

基于proto2这种情,如果想将proto生成的对象在网络上传输,还是需要借助一些工具,例如netty。具体请参考文章netty学习七:集成protobuf完成单个对象序列化以及在网络上传输


csdn code 路径


这个项目的源代码放置在csdn code上,欢迎访问。

netty_study

版权声明:本文为博主原创文章,未经博主允许不得转载。

一起学Netty(十二)之 Netty心跳简单Demo

前面简单地了解了一下IdleStateHandler,我们现在写一个简单的心跳demo: 1)服务器端每隔5秒检测服务器端的读超时,如果5秒没有接受到客户端的写请求,也就说服务器端5秒没有收到读事件,...
  • linuu
  • linuu
  • 2016年05月14日 10:15
  • 6338

netty小案例demo

Netty是业界最流行的NIO框架之一,它的健壮性、功能、性能、可定制性和可扩展性在同类框架中都是首屈一指的,它已经得到成百上千的商用项目验证,例如Hadoop的RPC框架avro使用Netty作为底...
  • u010011737
  • u010011737
  • 2016年08月04日 18:28
  • 1527

一起学Netty(十)之 Netty使用Google的ProtoBuf

protobuf是由Google开发的一套对数据结构进行序列化的方法,可用做通信协议,数据存储格式,等等。其特点是不限语言、不限平台、扩展性强 Netty也提供了对Protobuf的天然支持,我们...
  • linuu
  • linuu
  • 2016年05月11日 19:44
  • 14834

netty学习八:在window上安装thrift以及第一个小demo

下载thrift window编译器 需要先下载编译器,本文用的版本是: thrift-0.10.0.exe 对应的下载链接:thrift编译器 将下载好后的thrift-0.10...
  • linsongbin1
  • linsongbin1
  • 2017年08月09日 09:28
  • 861

Protobuf3 系列一 第一个Java demo

概念 Protocol buffers are a flexible, efficient, automated mechanism for serializing structured da...
  • hry2015
  • hry2015
  • 2017年04月20日 19:57
  • 821

netty学习七:集成protobuf完成单个对象序列化以及在网络上传输

概述本文介绍使用netty集成google的protobuf框架,完成proto JAVA对象的序列化和反序列化。编写proto文件protobuf使用.proto文件来描述对象结构体的信息。 Pe...
  • linsongbin1
  • linsongbin1
  • 2017年08月07日 21:41
  • 1033

netty学习二:基于socket通讯的小demo

netty socket编程小demo
  • linsongbin1
  • linsongbin1
  • 2017年07月29日 16:07
  • 687

netty学习三:基于socket的聊天小demo

netty学习三:基于socket的聊天小demo
  • linsongbin1
  • linsongbin1
  • 2017年07月30日 12:53
  • 567

Netty学习(七)-Netty编解码技术以及ProtoBuf和Thrift的介绍

谈到序列化我们自然想到java提供的Serializable接口,在java中我们如果需要序列化只需要继承该接口就可以通过输入输出流进行序列化和反序列化。但是在提供很用户简单的调用的同时他也存在很多问...
  • a953713428
  • a953713428
  • 2017年04月05日 13:08
  • 1522

基于netty和protobuf的聊天系统,客户端+服务器

  • 2018年01月06日 15:38
  • 3.72MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:netty学习六:第一个protobuf小demo
举报原因:
原因补充:

(最多只允许输入30个字)