netty学习六:第一个protobuf小demo

概述


本文介绍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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值