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

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

相关文章推荐

Netty5 Protobuf通信 解决半包

本文整合网上资源 给出了完整版本  对于高负载、高并发的网络应用,自己开发nio服务端,难度比较大、稳定性不能保证。于是选择nio框架netty+protobuf。netty对于消息编码和解码、半包读...

Nginx学习笔记(十九):Nginx连接

前言 上篇笔记记录了事件处理框架,以及事件的结构定义。这篇笔记开始Nginx连接定义。Nginx定义了基本的数据结构ngx_connection_t来表示连接,这类连接标识是由客户端主动发起、Ngin...
  • fzy0201
  • fzy0201
  • 2014年04月15日 20:01
  • 1943

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...
  • hry2015
  • hry2015
  • 2017年04月20日 19:57
  • 591

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

概述本文介绍使用netty集成google的protobuf框架,完成proto JAVA对象的序列化和反序列化。编写proto文件protobuf使用.proto文件来描述对象结构体的信息。 Pe...

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

netty socket编程小demo

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

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

netty+protobuf入门案例

  • 2014年04月14日 08:04
  • 1.65MB
  • 下载

Selenium Webdriver学习记录(一):环境搭建(Java+Maven+Eclipse+Selenium3.x)+第一个测试demo+部分问题解决

1.Selenium的学习网站:     官网:http://www.seleniumhq.org/docs/     中文网站:易百教程-->Selenium教程:http://www.yiibai...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:netty学习六:第一个protobuf小demo
举报原因:
原因补充:

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