vlambda博客
学习文章列表

那些很基础的教程之Protobuf

简介

protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。

Protocol Buffers 是一种灵活,高效,自动化机制的结构数据序列化方法-可类比 XML,但是比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单。

你可以定义数据的结构,然后使用特殊生成的源代码轻松的在各种数据流中使用各种语言进行编写和读取结构数据。你甚至可以更新数据结构,而不破坏由旧数据结构编译的已部署程序。

下载地址

https://github.com/protocolbuffers/protobuf/releases

release 仓库 选择最新的包下载(我不管,我就要最新的)

image.png

安装

cd protobuf-3.17.3
cp -r include/ /usr/local/include/
cp -r bin/ /usr/local/bin/

搞定,如此丝滑~

那些很基础的教程之Protobuf
image.png

使用

UserPB.info

syntax = "proto3";

option java_outer_classname = "UserPB";
option java_package = "com.jiuling.resource.proto";

message info{
string addr = 1; //地址
string group = 2; //分组
}
那些很基础的教程之Protobuf
image.png

ProtoBufTest

 public static void main(String[] args) {

        UserPB.info info = UserPB.info.newBuilder().setAddr("测试").setGroup("group1").build();

        System.out.println(info);
        byte[] data = info.toByteArray();
        try {
            UserPB.info p2 = UserPB.info.parseFrom(data);
            System.out.println(p2);
        } catch (InvalidProtocolBufferException e) {
            e.printStackTrace();
        }
    }

输出结果:

image.png

处理中文异常

 public static void main(String[] args) {

        UserPB.info info = UserPB.info.newBuilder().setAddr("测试").setGroup("group1").build();
        System.out.println(TextFormat.printer().escapingNonAscii(false).printToString(info));

        System.out.println(info.getAddr());
//        System.out.println(info);
        byte[] data = info.toByteArray();
        try {
            UserPB.info p2 = UserPB.info.parseFrom(data);
            System.out.println(TextFormat.printer().escapingNonAscii(false).printToString(p2));
            System.out.println(p2.getAddr());
        } catch (InvalidProtocolBufferException e) {
            e.printStackTrace();
        }
    }
image.png

搞定

主要是记录一些,很基础,但是你就是要去搜,就很烦的基操~