中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用Protobuf序列化

發布時間:2021-10-18 09:50:11 來源:億速云 閱讀:126 作者:柒染 欄目:編程語言

這篇文章給大家介紹如何使用Protobuf序列化,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

java自帶的序列化機制效率太低,有很多缺點。因此涌現出了很多優秀的系列化框架,比如說protobuf、protostuff、thrift、hession、kryo、avro、fst、msgpack等等。這篇文章我們就看一下protobuf,給出一個簡單案例,看看其是如何實現的。

注:若你對序列化概念和基本使用還有疑惑,可以翻看我之前的文章,或者百度一些基本概念和作用。

一、為什么要使用protobuf?

使用protobuf的原因肯定是為了解決開發中的一些問題,那使用其他的序列化機制會出現什么問題呢?

(1)java默認序列化機制:效率極低,而且還能不能跨語言之間共享數據。

(2)XML常用于與其他項目之間數據傳輸或者是共享數據,但是編碼和解碼會造成很大的性能損失。

(3)json格式也是常見的一種,但是在json在解析的時候非常耗時,而且json結構非常占內存。

但是我們protobuf是一種靈活的、高效的、自動化的序列化機制,可以有效的解決上面的問題。

二、如何使用protobuf

protobuf這么優秀使用起來也是非常的簡單,我們可以給出其主要的三個步驟,然后使用一個基本的案例去實現一下。

(1)定義.proto文件:我們在這個文件中描述我們序列化的信息,類似于bean類。

(2)根據.proto生成對應的類文件,上面這個proto就像是一個模板,現在我們要根據這個模板創建出一個java類。

(3)序列化。

有了這個基本的步驟我們我們就具體去實現一下:

1、下載安裝protobuf

第一步:下載解壓

我的電腦是windows10,因此這里給出在windows下的使用,linux下面使用我也將在后續文章推出。我們首先下載protobuf(github上搜索protobuf,有各種語言可供選擇)。選擇protoc-3.9.0-win64.zip。下載完成之后解壓到D:/protobuf目錄下面就好了。

第二步:配置環境變量

也就是將D:\protobuf\protoc-3.9.0-win64\bin配置到path環境變量里面。

第三步:驗證是否安裝成功

最后我們可以在cmd中輸入protoc --version驗證一下,是否成功。

OK,到這里我們就安裝好了。

2、編寫proto文件

之前我們說過proto  文件非常類似java的bean。在這里我們在bin目錄下新建一個Person.proto文件(和proto.exe)。輸入下列內容:

syntax="proto3";  option java_package = "com.fdd.protobuf";    option java_outer_classname = "PersonProto";    message Person  {    string name = 1;   int32 age = 2; }

我們解釋一些我們都寫了什么

(1)第一行有一個proto3,他表示的是protobuf的語法版本,就類似于jdk1.7和jdk1.8的概念。需要在第一行指定。默認使用的是proto2。

(2)java_package:表示的是java包,不指定就使用  package.生成的類會放到該package下。這里表示把生成的類存放在com.fdd.protobuf包下面。

(3)java_outer_classname:我們說過.proto文件,要生成對應的類,這個參數就指定輸出什么類名。這里表示生成的類名是PersonProto。

(4)message 是用于數據格式定義.

  • 一個 .proto 文件中可以定義多個 message

  • message 中定義的字段支持 string、byte、bool、map、enum、數字類型和用戶自定義的 message

  • 定義字段后面需要指定唯一的標識數字,這些數字用于識別二進制格式 message 中的字段,一旦開始使用這個 message,那么標識數字就不能改變

  • 如果需要定義 List,則在字段前加repeated即可.

  • 如果已經使用過該 message  生成的類后,想要增加字段直接新增即可.當新增字段的類解析老數據時,會將新字段置為默認值.當舊的類解析新數據時會忽視掉新增字段.

比如說這里我們就定義一個復雜的proto文件:

syntax = "proto3"; option java_package = "com.fdd.protobuf"; option java_outer_classname = "Persons"; message Staff {     int32 id = 1;     string name = 2;     int32 age = 3;     // 枚舉示例     enum PhoneType {         MOBILE = 0;         TELEPHONE = 1;     }     // 嵌套示例     message PhoneNumber {         string number = 1;         PhoneType type = 2;      }      // list示例     repeated PhoneNumber phone = 4;           message Map {         string key = 1;         int32 value = 2;     }     // map示例     Map map = 5; }

由于這里只是展示一個基本案例,對于其他的數據類型可以根據自己的需要定義即可。

3、根據proto文件生成class類文件

編譯起來很簡單,在我們下載好的protobuf下面有一個bin目錄,里面有一個proto.exe。我們就使用這個去編譯person.proto文件就好。

也就是執行proto.exe --java_out = / Person.proto就會編譯成功。

4、使用class類文件

上面意味著我們已經做好了序列化的準備工作,接下來我們就可以直接使用這個類了。

(1)第一步:將生成的PersonProto類引入到我們的IDEA或者是eclipse中。

(2)第二步:在idea或者是eclipse添加protobuf的依賴。

<dependency>     <groupId>com.google.protobuf</groupId>     <artifactId>protobuf-java</artifactId>     <version>3.9.0</version> </dependency>

(3)第三步:使用

首先看一些如何序列化:

//1、 創建Builder PersonProto.Person.Builder builder = PersonProto.Person.newBuilder(); //2、 設置Person的屬性 builder.setAge(20); builder.setName("java的架構師技術棧"); //3、 創建Person PersonProto.Person person = builder.build(); //4、序列化 byte[] data = person.toByteArray(); //5、將data保存在本地或者是傳到網絡

然后反序列化

try {        //一行代碼實現反序列化,data可以是本地數據或者是網絡數據        PersonProto.Person person = PersonProto.Person.parseFrom(data);        System.out.println(person.getAge());        System.out.println(person.getName()); } catch (InvalidProtocolBufferException e) {        e.printStackTrace(); }

關于如何使用Protobuf序列化就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

肥乡县| 福州市| 华蓥市| 东宁县| 独山县| 河南省| 讷河市| 朝阳区| 清原| 麻城市| 公主岭市| 谢通门县| 衡南县| 关岭| 石楼县| 金堂县| 马边| 利津县| 从江县| 顺义区| 靖安县| 菏泽市| 马山县| 荥阳市| 长春市| 浙江省| 哈尔滨市| 霍邱县| 永济市| 同江市| 伊吾县| 山阳县| 紫金县| 德安县| 葵青区| 佛冈县| 江源县| 罗江县| 鞍山市| 北流市| 康乐县|