protobuf 3

      Protobuf3是类似json,xml的数据交换协议,但是传输的数据更小,传输的速度更快; 跨语言交互,支持大部分主流编程语言。protobuf是一种数据交换的格式,以二进制的格式进行数据交换,

主要用于网络传输、配置文件、数据存储等诸多领域。

idea中编译protobuf
  首先,下载安装Protobuf Support插件

       其次,添加依赖

    <properties>
        <protobuf.version>3.7.1</protobuf.version>
        <grpc.version>1.22.0</grpc.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
            <version>${protobuf.version}</version>
        </dependency>
        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java-util</artifactId>
            <version>${protobuf.version}</version>
        </dependency>

        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-all</artifactId>
            <version>${grpc.version}</version>
        </dependency>
    </dependencies>

      Message

   Protobuf3通过proto文件定义交互的对象,student.proto如下:
syntax = "proto3";

option java_package = "com.smile.entity";
option java_outer_classname = "StudentProtoBuf";

message student {
    int32 id = 1;   //指定字段类型为 int32,标识号为 1
    string name = 2;
    string email = 3;

    enum Sex {
        MAN = 0;
        WOMAN = 1;
    }
    Sex sex = 4;

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

    //内部类
    message PhoneNumber {
        string number = 1;
        PhoneType phoneType = 2;
    }

    repeated PhoneNumber phoneNumber = 5;
}

  使用插件将proto文件转换为java文件

  测试类

public class ProtoBufTest {

    public static void main(String[] args) {
        StudentProtoBuf.student.Builder studentBuilder = StudentProtoBuf.student.newBuilder();
        studentBuilder.setId(10001);
        studentBuilder.setName("美国队长");
        studentBuilder.setEmail("123@qq.com");
        studentBuilder.setSex(StudentProtoBuf.student.Sex.MAN);

        StudentProtoBuf.student.PhoneNumber.Builder mobilePhone = StudentProtoBuf.student.PhoneNumber.newBuilder();
        mobilePhone.setNumber("123456");
        mobilePhone.setPhoneType(StudentProtoBuf.student.PhoneType.MOBILE);
        studentBuilder.addPhoneNumber(mobilePhone.build());

        StudentProtoBuf.student.PhoneNumber.Builder homePhone = StudentProtoBuf.student.PhoneNumber.newBuilder()
                .setNumber("10001-22222")
                .setPhoneType(StudentProtoBuf.student.PhoneType.HOME);
        studentBuilder.addPhoneNumber(homePhone.build());

        //序列化
        StudentProtoBuf.student student = studentBuilder.build();
        System.out.println("protobuf数据的大小:" + student.toByteString().size());
        //再将封装有数据的对象实例,转换为字节数组,用于数据传输、存储等
        byte[] stuBytes = student.toByteArray();


        //反序列化
        StudentProtoBuf.student student1 = null;
        try {
            student1 = StudentProtoBuf.student.parseFrom(stuBytes);
            System.out.println("学生的Id号:" + student1.getId());
            System.out.println("学生的姓名:" + student1.getName());
            System.out.println("学生的邮箱:" + student1.getEmail());
            System.out.println("学生的性别:" + (student1.getSex().getNumber() == 0 ? "男" : "女"));
            List<StudentProtoBuf.student.PhoneNumber> phoneNumberList = student1.getPhoneNumberList();
            for (StudentProtoBuf.student.PhoneNumber phoneNumber : phoneNumberList) {
                System.out.println(phoneNumber.getPhoneType() + " " + phoneNumber.getNumber());
            }
        } catch (InvalidProtocolBufferException e) {
            e.printStackTrace();
        }

        //快速json序列化
        String jsonObject = "";
        try {
            jsonObject = JsonFormat.printer().print(student);
        } catch (InvalidProtocolBufferException e) {
            e.printStackTrace();
        }
        System.out.println("json数据:" + jsonObject.toString());
        System.out.println("json数据大小:" + jsonObject.getBytes().length);
    }
}

Map对象:key,value都可以是复杂对象

message ComplexObject {
   map<string, MapVaule> map = 8; // 定义Map对象
}
// 定义Map的value值
message MapVaule {
  string mapValue = 1;
}
// 对应proto里:map<string, MapVaule> map_field = 8;
MapVaule.Builder mapValue = MapVaule.newBuilder();
mapValue.setMapValue("mapValue");
builder.putMap("mapKey", mapValue.build());

 

posted on 2022-04-14 11:53  溪水静幽  阅读(280)  评论(0)    收藏  举报