记一个protobuf的学习用例

200 阅读1分钟

pb好处,不在本文的说明范围,可直接参考官方文档(Link)。 这里记录笔者一个例程。 具体如下:

环境

idea

步骤

  1. 创建addressbook.proto文件。入下:
syntax = "proto2";

package docType;

option java_package = "docType";

option java_outer_classname = "AddressBookProtos";

message Person {
  optional string name = 1;
  optional int32 id = 2;
  optional string email = 3;

  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }

  message PhoneNumber {
    required string number = 1;
    optional PhoneType type = 2 [default = HOME];
  }

  repeated PhoneNumber phones = 4;
}

message AddressBook {
  repeated Person people = 1;
}
  1. 生成AddressBookProtos类

命令格式如下protoc -I=$SRC_DIR --java_out=$DST_DIR $SRC_DIR/addressbook.proto

  1. 创建测试用例

这个测试用例,是先创建一个AddressBook,存入文件,然后在从文件中读取。包括了整个pb使用流程。

代码如下:

import docType.AddressBookProtos;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class PbTest {
    public static void main(String[] args) throws Exception {
        String file = "./out/pb";
        creatPbAndSave(file);

        AddressBookProtos.AddressBook.Builder addressBook = AddressBookProtos.AddressBook.newBuilder();
        try {
            addressBook.mergeFrom(new FileInputStream(file));
        } catch (FileNotFoundException e) {
            System.out.println(args[0] + ": File not found.  Creating a new file.");
        }
        System.out.println(addressBook.getPeople(0).getEmail());

    }
    private static void creatPbAndSave(String filePath) throws IOException {
        AddressBookProtos.Person john =
                AddressBookProtos.Person.newBuilder()
                        .setId(1234)
                        .setName("John Doe")
                        .setEmail("jdoe@example.com")
                        .addPhones(
                                AddressBookProtos.Person.PhoneNumber.newBuilder()
                                        .setNumber("555-4321")
                                        .setType(AddressBookProtos.Person.PhoneType.HOME)
                                        .build())
                        .build();
        AddressBookProtos.AddressBook addressBook =
                AddressBookProtos.AddressBook.newBuilder()
                        .addPeople(0, john)
                        .build();

        FileOutputStream output = new FileOutputStream(filePath);
        addressBook.writeTo(output);
        output.close();
    }
}