protobuf-java入门指南

简介

protobuf是google提出的一种于语言无关的序列化协议,经常用于RPC之间的通信协议,其具有简单、编解码高效、空间占用率低等特点深受广大用户的喜好,其已经广泛应用于诸多的开源软件中,详情请参考protobuff。

protobuf性能对比图

protobuf-java入门指南_第1张图片
序列化大小
protobuf-java入门指南_第2张图片
序列化耗时
protobuf-java入门指南_第3张图片
具体的数字

安装步骤

window环境

  1. 下载protobuf,解压。
  2. 下载protobuf-2.5.0-windows.zip。
  3. 解压protobuf-2.5.0-windows.zip,把protoc.exe放在Protobuf安装目录下的src里。(其实放哪都可以)
  4. 将protoc.exe的位置信息加入到PATH变量中
protobuf-java入门指南_第4张图片
配置PATH

mac环境

  1. 通过brew进行安装,brew install protobuf250
  2. protoc --version验证是否安装成功


    环境验证

创建maven工程

  1. pom文件如下所示,添加对protobuf的依赖,同时在build中添加hadoop-maven-plugins保证在generate-sources的时候生成java源代码。

    4.0.0

    com.aliyun.sts.sample
    sts-sdk-sample
    1.0-SNAPSHOT
    jar

    sts-sdk-sample
    http://maven.apache.org

    
        UTF-8
        5.22.0
        2.5.0
        ${env.HADOOP_PROTOC_PATH}
    

    
        
            junit
            junit
            3.8.1
            test
        
        
        
            com.google.protobuf
            protobuf-java
            2.5.0
        
    

    

        
            
            
                org.apache.maven.plugins
                maven-assembly-plugin
                2.4.1
                
                    
                    
                        jar-with-dependencies
                    
                    
                    
                        
                            com.aliyun.sts.sample.OnboardingRequest
                        
                    
                
                
                    
                        make-assembly
                        
                        package
                        
                            single
                        
                    
                
            

                    
                        org.apache.hadoop
                        hadoop-maven-plugins
                        
                            
                                compile-protoc
                                generate-sources
                                
                                    protoc
                                
                                
                                    ${protobuf.version}
                                    ${protoc.path}
                                    
                                        ${basedir}/src/main/java/com/aliyun/sts/sample/proto
                                    
                                    
                                        ${basedir}/src/main/java/com/aliyun/sts/sample/proto
                                        
                                            mobile.proto
                                        
                                    
                                    ${project.build.directory}/generated-sources/java
                                
                            
                        
                    
        
    

  1. maven工程组织结构参考下图


    protobuf-java入门指南_第5张图片
    工程结构图
  2. 构建mobile.proto文件,定义消息类的格式信息。

option java_package = "com.aliyun.sts.sample.proto";
option java_outer_classname = "Mobile";
option java_generate_equals_and_hash = true;

package com.liujianhui;

message MobilePhone{

    required string               brand = 1 ;
    required Hardware          hardware = 2;
    repeated string              software = 3;

}

message Hardware {

    required int32                    rom = 1;
    required int32                    ram = 2;
    required int32                    size = 3 ;

}

4.测试类,完成序列化和反序列化操作

package com.aliyun.sts.sample.proto;

import com.google.protobuf.InvalidProtocolBufferException;

/**
 * Created by liujianhui on 17/5/3.
 */
public class MobieTest {
    public static void main(String[] args) throws InvalidProtocolBufferException {
        Mobile.MobilePhone.Builder builder = Mobile.MobilePhone.newBuilder();
        Mobile.Hardware.Builder hardware = Mobile.Hardware.newBuilder();
        hardware.setRam(2).setRom(16).setSize(5);
        builder.setHardware(hardware)
                .setBrand("Apple")
                .addSoftware("camera")
                .addSoftware("tecent")
                .addSoftware("browser")
                .addSoftware("player");
        byte[] messageBody = builder.build().toByteArray();

        int headerLen = 1;
        byte[] message = new byte[headerLen+messageBody.length];
        message[0] = (byte)messageBody.length;
        System.arraycopy(messageBody, 0,  message, 1, messageBody.length);
        System.out.println("msg len:"+message.length);

        Mobile.MobilePhone phone = Mobile.MobilePhone.parseFrom(messageBody);
        System.out.println("Receive:");
        System.out.println(phone.toString());
    }
}

5.测试结果,首先直接maven clean compile生成相关代码,然后运行MobileTest

msg len:49
Receive:
brand: "Apple"
hardware {
  rom: 16
  ram: 2
  size: 5
}
software: "camera"
software: "tecent"
software: "browser"
software: "player"

6.生成的源代码结构如下图所示


protobuf-java入门指南_第6张图片
生成的源文件

参考

  • http://blog.csdn.net/antgan/article/details/52103966

你可能感兴趣的:(protobuf-java入门指南)