美文网首页
protobuf-java入门指南

protobuf-java入门指南

作者: liujianhuiouc | 来源:发表于2017-05-03 23:31 被阅读0次

    简介

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

    protobuf性能对比图

    序列化大小 序列化耗时 具体的数字

    安装步骤

    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变量中
    配置PATH

    mac环境

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


      环境验证

    创建maven工程

    1. pom文件如下所示,添加对protobuf的依赖,同时在build中添加hadoop-maven-plugins保证在generate-sources的时候生成java源代码。
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.aliyun.sts.sample</groupId>
        <artifactId>sts-sdk-sample</artifactId>
        <version>1.0-SNAPSHOT</version>
        <packaging>jar</packaging>
    
        <name>sts-sdk-sample</name>
        <url>http://maven.apache.org</url>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <actVer>5.22.0</actVer>
            <protobuf.version>2.5.0</protobuf.version>
            <protoc.path>${env.HADOOP_PROTOC_PATH}</protoc.path>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>3.8.1</version>
                <scope>test</scope>
            </dependency>
            
            <dependency>
                <groupId>com.google.protobuf</groupId>
                <artifactId>protobuf-java</artifactId>
                <version>2.5.0</version>
            </dependency>
        </dependencies>
    
        <build>
    
            <plugins>
                <!-- Maven Assembly Plugin -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-assembly-plugin</artifactId>
                    <version>2.4.1</version>
                    <configuration>
                        <!-- get all project dependencies -->
                        <descriptorRefs>
                            <descriptorRef>jar-with-dependencies</descriptorRef>
                        </descriptorRefs>
                        <!-- MainClass in mainfest make a executable jar -->
                        <archive>
                            <manifest>
                                <mainClass>com.aliyun.sts.sample.OnboardingRequest</mainClass>
                            </manifest>
                        </archive>
                    </configuration>
                    <executions>
                        <execution>
                            <id>make-assembly</id>
                            <!-- bind to the packaging phase -->
                            <phase>package</phase>
                            <goals>
                                <goal>single</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
    
                        <plugin>
                            <groupId>org.apache.hadoop</groupId>
                            <artifactId>hadoop-maven-plugins</artifactId>
                            <executions>
                                <execution>
                                    <id>compile-protoc</id>
                                    <phase>generate-sources</phase>
                                    <goals>
                                        <goal>protoc</goal>
                                    </goals>
                                    <configuration>
                                        <protocVersion>${protobuf.version}</protocVersion>
                                        <protocCommand>${protoc.path}</protocCommand>
                                        <imports>
                                            <param>${basedir}/src/main/java/com/aliyun/sts/sample/proto</param>
                                        </imports>
                                        <source>
                                            <directory>${basedir}/src/main/java/com/aliyun/sts/sample/proto</directory>
                                            <includes>
                                                <include>mobile.proto</include>
                                            </includes>
                                        </source>
                                        <output>${project.build.directory}/generated-sources/java</output>
                                    </configuration>
                                </execution>
                            </executions>
                        </plugin>
            </plugins>
        </build>
    </project>
    
    1. maven工程组织结构参考下图


      工程结构图
    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入门指南

          本文链接:https://www.haomeiwen.com/subject/uonltxtx.html