ProtoBuf入门体验之小demo

     由于最近的项目开发要用到ProtoBuf,所以在这开一贴说说自己写的小demo。这款Google开发的开源项目相对于xml来说,它的优点主要有以下几点:

(1)性能好/效率高;

(2) 具有代码生成机制。

(3)支持向前/向后兼容。

(4)能够支持多种语言。

当然,“金无赤金,人无完人”,protobuf也是有缺点的。比如它采用二进制编码导致可读性变差。

在进行创建Demo之前,首先要下载关于Protobuf的文件,这里我用的是protobuf-2.4.1.tar.gz和与之相匹配的protobuf-java-2.4.1.jar文件。我已经将上述文件整理好放在了网盘中,大家如果有需要可以去下载。

链接:https://pan.baidu.com/s/1dS4q1eXVDFLxhkayYIQSXg 
提取码:d30o 

下载下来文件之后,解压之后如图所示:

ProtoBuf入门体验之小demo_第1张图片

等下会用到的是protoc.exe 和protobuf-java-2.4.1.jar文件。OK,前期的准备工作到这里就告一段落了,下面我们正式开始写Demo。

一、首先,我们创建一个.proto的文件,在记事本中写下以下内容,然后命名为PersonMsg.proto文件。

package protobuf;
option java_package = "com.sq.protobuf";//编译后生成Java文件的位置。
option java_outer_classname = "FirstProtobuf"; //编译之后生成的Java文件名称
message Person{
     //ID
     required int32 id =1;
     // 姓名
     required string name = 2;
     //email
     optional string email = 3;
     //朋友
     required string friends = 4;
//上面的1、2、3、4是unique numbered tag,是一个唯一标识

//required必填属性,optional选填属性


}

二、将上面写好的.proto文件放到与protoc.exe文件同级的目录下,之后再cmd命令行中执行下面的语句

protoc.exe --java_out = ./PersonMsg.proto

如果上面的语句编译报错,可以通过下面的语句进行编译,亲测有效。

protoc ./PersonMsg.proto --java_out=./

三、在IDEA或Eclipse中建立一个project,创建com.com.sq.protobuf包,然后将生成的FirstProtobuf.java文件加入到project中,这时候项目会报错,所以之前下载的protobuf-java-2.4.1.jar就要发挥作用了,将该jar文件导入到项目中,报错消失。

四、其实三四两步可以写一起的,但是我就想分开写,哈哈。好了,说正题了,新建一个测试类,代码如下:

package com.sq.protobuf;

import com.google.protobuf.InvalidProtocolBufferException;

public class Test_protobuf {
    public static void main(String[] args){
        //序列化
        FirstProtobuf.Person.Builder builder = FirstProtobuf.Person.newBuilder();
        builder.setId(1);
        builder.setName("Jackson");
        builder.setEmail("[email protected]");
        builder.setFriends("Oliver");

        FirstProtobuf.Person info = builder.build();
        byte[] result = info.toByteArray();
        System.out.println("序列化:"+result);


        //反序列化
        try {
            FirstProtobuf.Person person = FirstProtobuf.Person.parseFrom(result);
            System.out.println("反序列化:"+person);
        } catch (InvalidProtocolBufferException e) {
            e.printStackTrace();
        }


    }
}

最后,运行程序,出现如下结果,这是可以看到序列化和反序列化的结果。

五、总结一下,Protobuf作为一个比XML更小,更快的一个方法,可以利用自己的代码生成机制生成代码去读写自己定义的数据结构,为我们省去了一大部分写协议解析代码的时间。当然,本文只是对Protobuf有了一个初始的认识,还希望读到这篇文章的读者们有什么意见或建议可以提出来,让大家一起进步!

 

 

 

你可能感兴趣的:(Java,后端开发,Protobuf)