自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Protobuf序列化這么強,為什么不花五分鐘學習一下呢?

開發(fā) 后端
java自帶的序列化機制效率太低,有很多缺點。因此涌現(xiàn)出了很多優(yōu)秀的系列化框架,比如說protobuf、protostuff、thrift、hession、kryo、avro、fst、msgpack等等。

[[378317]]

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

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

一、為什么要使用protobuf?

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

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

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

(3)json格式也是常見的一種,但是在json在解析的時候非常耗時,而且json結(jié)構(gòu)非常占內(nèi)存。

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

二、如何使用protobuf

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

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

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

(3)序列化。

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

1、下載安裝protobuf

第一步:下載解壓

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

第二步:配置環(huán)境變量

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

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

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

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

2、編寫proto文件

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

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

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

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

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

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

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

  • 一個 .proto 文件中可以定義多個 message
  • message 中定義的字段支持 string、byte、bool、map、enum、數(shù)字類型和用戶自定義的 message
  • 定義字段后面需要指定唯一的標識數(shù)字,這些數(shù)字用于識別二進制格式 message 中的字段,一旦開始使用這個 message,那么標識數(shù)字就不能改變
  • 如果需要定義 List,則在字段前加repeated即可.
  • 如果已經(jīng)使用過該 message 生成的類后,想要增加字段直接新增即可.當新增字段的類解析老數(shù)據(jù)時,會將新字段置為默認值.當舊的類解析新數(shù)據(jù)時會忽視掉新增字段.

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

  1. syntax = "proto3"
  2. option java_package = "com.fdd.protobuf"
  3. option java_outer_classname = "Persons"
  4. message Staff { 
  5.     int32 id = 1; 
  6.     string name = 2; 
  7.     int32 age = 3; 
  8.     // 枚舉示例 
  9.     enum PhoneType { 
  10.         MOBILE = 0; 
  11.         TELEPHONE = 1; 
  12.     } 
  13.     // 嵌套示例 
  14.     message PhoneNumber { 
  15.         string number = 1; 
  16.         PhoneType type = 2; 
  17.  
  18.     }  
  19.     // list示例 
  20.     repeated PhoneNumber phone = 4;       
  21.     message Map { 
  22.         string key = 1; 
  23.         int32 value = 2; 
  24.     } 
  25.     // map示例 
  26.     Map map = 5; 

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

3、根據(jù)proto文件生成class類文件

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

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

4、使用class類文件

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

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

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

  1. <dependency> 
  2.     <groupId>com.google.protobuf</groupId> 
  3.     <artifactId>protobuf-java</artifactId> 
  4.     <version>3.9.0</version> 
  5. </dependency> 

(3)第三步:使用

首先看一些如何序列化:

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

然后反序列化

  1. try { 
  2.        //一行代碼實現(xiàn)反序列化,data可以是本地數(shù)據(jù)或者是網(wǎng)絡數(shù)據(jù) 
  3.        PersonProto.Person person = PersonProto.Person.parseFrom(data); 
  4.        System.out.println(person.getAge()); 
  5.        System.out.println(person.getName()); 
  6. } catch (InvalidProtocolBufferException e) { 
  7.        e.printStackTrace(); 

OK,基本的使用流程就是這。

總結(jié)

基本上就是我們定義好proto文件,然后使用proto.exe編譯成類文件,最后導入這個類和依賴就可以直接使用了。當然這只是一個最簡單不過的代碼,可以把這篇教程當成一個簡單的使用教程。

 

責任編輯:武曉燕 來源: 愚公要移山
相關推薦

2021-03-10 18:05:16

JavaProtobuf序列化

2011-06-01 15:18:43

Serializabl

2019-10-24 08:11:19

IP下一跳靜態(tài)路由

2023-07-02 16:34:06

GPU虛擬化深度學習

2024-09-03 08:17:59

2009-11-16 10:53:30

Oracle Hint

2024-12-11 07:00:00

面向?qū)ο?/a>代碼

2025-03-13 06:22:59

2020-06-16 08:47:53

磁盤

2023-07-12 15:50:29

機器學習人工智能

2022-03-18 15:41:29

原子化服務HarmonyOS鴻蒙

2020-03-06 10:45:48

機器學習人工智能神經(jīng)網(wǎng)絡

2009-11-02 18:07:58

Oracle數(shù)據(jù)庫

2019-07-09 14:42:17

SQLexplain索引

2021-06-07 09:51:22

原型模式序列化

2009-11-05 14:53:54

Visual Stud

2021-10-19 07:27:08

HTTP代理網(wǎng)絡

2009-10-22 16:18:19

Oracle表空間

2024-09-18 08:21:24

JavaScriptTypeScriptprototype

2019-08-09 10:33:36

開發(fā)技能代碼
點贊
收藏

51CTO技術棧公眾號