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

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

相关文章推荐

浅谈Protobuf

最近在学习Netty,通信层框架就讲到了序列化和反序列化的框架,其中就谈到了Protobuf,结合官网上的讲解(官网URL:https://developers.google.com/protocol...

Google Protobuf java 序列化工具的使用

Google Protobuf java 序列化工具的使用why? 使用Java序列化。这是默认的方法,效率比较低。 将数据序列化为XML。这种方法可能非常有吸引力,因为XML是(可能的)人类可读的,...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

java调用protobuf

protocolbuffer(以下简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台。google 提供了三种语言的实现:java、c++ 和 python,每一种实现都包含了相...

java中使用Protobuf的实例(Demo)

由于Protobuf受到推崇,故尝试采用protobuf来摒弃传统的xml进行传输数据。 首先,需要下载的关于Protobuf的文件: 1.到http://code.g...

netty学习四:监听channel的读写空闲情况

概述netty提供了一个IdleStateHandler类,可以用监听channel的读写空闲状态。构造方法如下: public IdleStateHandler(long readerIdleTim...

netty学习五:websocket小demo

netty学习五:websocket小demo

修改maven默认的jdk版本

修改maven默认的jdk版本,想改彻底需要在maven的全局配文件(settings.xml)增加以下信息: 在profiles 节点下增加:     jdk-1.6         ...

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

下载thrift window编译器 需要先下载编译器,本文用的版本是: thrift-0.10.0.exe 对应的下载链接:thrift编译器 将下载好后的thrift-0.10...

Protobuf3 系列一 第一个Java demo

概念 Protocol buffers are a flexible, efficient, automated mechanism for serializing structured da...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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