天天看點

java項目使用protobuf學習筆記

  1. 添加依賴
    <dependency>
        <groupId>com.google.protobuf</groupId>
        <artifactId>protobuf-java</artifactId>
        <version>3.12.4</version>
    </dependency>
               
  2. maven插件配置(pom.xml)
    <build>
        <extensions>
            <extension>
                <groupId>kr.motd.maven</groupId>
                <artifactId>os-maven-plugin</artifactId>
                <version>1.6.2</version>
            </extension>
        </extensions>
        <plugins>
            <plugin>
                <groupId>org.xolstice.maven.plugins</groupId>
                <artifactId>protobuf-maven-plugin</artifactId>
                <version>0.6.1</version>
                <extensions>true</extensions>
                <configuration>
                    <protoSourceRoot>${project.basedir}/src/main/proto</protoSourceRoot>
                    <outputDirectory>${project.build.directory}/generated-sources/protobuf/java</outputDirectory>
                    <!--設定是否生成java檔案之前清空outputDirectory的檔案,預設值為true,設定false時會覆寫同名檔案-->
                    <clearOutputDirectory>true</clearOutputDirectory>
                    <protocArtifact>com.google.protobuf:protoc:3.12.4:exe:${os.detected.classifier}</protocArtifact>
                    <pluginId>grpc-java</pluginId>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                            <goal>compile-custom</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
               
  3. 定義proto檔案
    syntax = "proto3";
    option java_package = "com.yicj.study.proto" ;
    option java_outer_classname = "PersonModel" ;
    message Person{
        int32 id = 1 ;
        string name = 2 ;
        string email = 3 ;
    }
               
  4. 找到plugins中的protobuf點選protobuf:compile生成對應的java檔案(target/generated-sources/protobuf/java)
  5. 将PersonModel檔案移動到源碼包下com.yicj.study.proto中
  6. 編寫單元測試
    public class PersonModelTest {
        @Test
        public void hello() throws InvalidProtocolBufferException {
            PersonModel.Person forezp = PersonModel.Person.newBuilder()
                    .setId(1).setName("forezp").setEmail("[email protected]").build() ;
            for (byte b : forezp.toByteArray()){
                System.out.print(b);
            }
            String s = CommonUtil.base64Encode(forezp.toByteArray());
            System.out.println();
            System.out.println("====================> " + s);
            System.out.println();
            log.info("\n" + "bytes長度" + forezp.toByteString().size());
            log.info("========forezp Byte 結束==========");
            log.info("========forezp 反序列化生成對象開始======");
            PersonModel.Person forezpCopy = PersonModel.Person.parseFrom(forezp.toByteArray()) ;
            log.info(forezpCopy.toString());
            log.info("====== forezp 反系列化生成對象結束=======");
        }
    }