日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

ProtoBuf的介绍以及在Java中使用protobuf将对象进行序列化与反序列化

發布時間:2025/3/19 java 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ProtoBuf的介绍以及在Java中使用protobuf将对象进行序列化与反序列化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

場景

ProtoBuf簡介

protocol buffers 是一種語言無關、平臺無關、可擴展的序列化結構數據的方法,它可用于(數據)通信協議、數據存儲等。

Protocol Buffers 是一種靈活,高效,自動化機制的結構數據序列化方法-可類比 XML,但是比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更為簡單。

你可以定義數據的結構,然后使用特殊生成的源代碼輕松的在各種數據流中使用各種語言進行編寫和讀取結構數據。你甚至可以更新數據結構,而不破壞由舊數據結構編譯的已部署程序。

ProtocolBuffer擁有多項比XML更高級的串行化結構數據的特性,ProtocolBuffer:

·??????? 更簡單

·??????? 小3-10倍

·??????? 快20-100倍

·??????? 更少的歧義

·??????? 可以方便的生成數據存取類

怎樣使用ProtoBuf

定義proto描述文件

首先需要在一個 .proto 文件中定義你需要做串行化的數據結構信息。每個ProtocolBuffer信息是一小段邏輯記錄,包含一系列的鍵值對。這里有個非常簡單的 .proto 文件定義了個人信息:

message Person {required string name=1;required 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 phone=4; }

當然這里的protobuf的秒數文件.proto也是有版本語法限制的,比如protoBuf3中沒有required和optional。

每個消息類型擁有一個或多個特定的數字字段,每個字段擁有一個名字和一個值類型。值類型可以是數字(整數或浮點)、布 爾型、字符串、原始字節或者其他ProtocolBuffer類型,還允許數據結構的分級。

上面的message就類似于類,下面是屬性。

required在protobuf2代表是必填的,optional在protobuf2中代表是可選的。repeated代表重復字段,類似于list。

下面的enum代表是枚舉。

下面的message是在上面Person的里面,代表內部類。default代表默認值。

需要注意的是這里的=1,=2等都不是對其進行賦值,而是對屬性做一個唯一標志。

編譯描述文件

一旦你定義了自己的報文格式(message),你就可以運行ProtocolBuffer編譯器,將你的 .proto 文件編譯成特定語言的類。這些類提供了簡單的方法訪問每個字段(像是 query() 和set_query()),像是訪問類的方法一樣將結構串行化或反串行化。

編譯器下載地址:

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

選擇指定的操作系統的指定protobuf版本的protoc編譯器進行下載

?

這里操作系統是Windows64位并且在下面要使用的protobuf的版本是3.13

所以這里下載對應的版本

?

將其下載到電腦上某路徑下解壓

?

后續就可以使用protoc.exe對proto文件進行編譯。

為了使用方便,這里將protoc.exe添加進環境變量

?

然后打開cmd,輸入protoc后回車,會輸出編譯的提示命令則是成功

?

?

Java中使用ProtoBuf序列化和反序列化示例

新建項目并引入依賴

打開IDEA-新建一個gradle項目,當然你也可以新建一個Maven項目。

這里以使用gradle作為依賴管理進行示例。

新建gradle項目后選擇Java語言,然后添加protobuf相關的依賴。

來到Maven的中央倉庫

https://mvnrepository.com/

搜索protobuf

?

這兩個就是需要引入的依賴。

分別進入兩個依賴中選擇跟上面的編譯的版本一致的版本

?

這里是Gradle的依賴,你也可以使用Maven并復制Maven的依賴。

?

找到IDEA中新建的gradle項目的build.gradle將兩個依賴添加進去。

dependencies {compile ([group:'com.google.protobuf', name: 'protobuf-java', version: '3.13.0'],[group:'com.google.protobuf', name: 'protobuf-java-util', version: '3.13.0']) }

因為設置了自動導入,所以會在項目中引入Google的相關protobuf的依賴的jar包

?

編寫proto描述文件

然后在src下新建protobuf目錄,在此目錄下新建文件Student.proto

?

此時IDEA會提示,選擇Text即可。

syntax = "proto3";package com.badao.protobuf;option optimize_for =SPEED; option java_package = "com.badao.protobuf"; option java_outer_classname = "DataInfo";message Student {string name = 1;int32 age = 2;string address = 3; }

然后將其內容修改如下

這里的syntax代表使用的語法規則是protobuf3

然后下面的package是缺省時的包名,如果下面沒有設置java_package則會使用此設置,如果設置了則不會使用。

下面的是一些配置

optimize_for是文件級別的選項,Protocol Buffer定義三種優化級別SPEED/CODE_SIZE/LITE_RUNTIME。缺省情況下是SPEED。

SPEED: 表示生成的代碼運行效率高,但是由此生成的代碼編譯后會占用更多的空間。

然后java_package就是配置的生成代碼的包名,

java_outer_classname選項表明想要生成Java類的名稱。如果在.proto文件中沒有明確的java_outer_classname定義,生成的class名稱將會根據.proto文件的名稱采用駝峰式的命名方式進行生成。如(foo_bar.proto生成的java類名為FooBar.java)。

這里配置的類名就叫DataInfo。

編譯描述文件生成代碼

在IDEA中下面的Terminal新建一個終端

?

因為已經將protoc編譯命令的exe添加進環境變量,所以這里直接使用protoc命令即可。

protoc --java_out=src/main/java src/protobuf/Student.proto

這里--java_out=src/main/java就是設置的要生成代碼后存放的位置

后面跟著個空格然后跟的是 proto描述文件的位置

回車后如果沒有報錯,并且已經在src/main/java/com/badao/protobuf下生成DataInfo類

?

則編譯成功。

對象數據的序列化與反序列化

在此包下新建一個ProtobuTest類,并編寫main方法

package com.badao.protobuf;import com.google.protobuf.InvalidProtocolBufferException;public class ProtobufTest {public static void main(String[] args) throws InvalidProtocolBufferException {DataInfo.Student student = DataInfo.Student.newBuilder().setName("公眾號:霸道的程序猿").setAge(100).setAddress("中國").build();byte[] bytes = student.toByteArray();DataInfo.Student student1 = DataInfo.Student.parseFrom(bytes);System.out.println(student1.getName());System.out.println(student1.getAge());System.out.println(student1.getAddress());} }

注意這里的新建對象并對屬性進行賦值時必須采用如上這種方式

??????? DataInfo.Student student = DataInfo.Student.newBuilder().setName("公眾號:霸道的程序猿").setAge(100).setAddress("中國").build();

然后將對象進行序列化為字節數組就可以通過

byte[] bytes = student.toByteArray();

將字節數據反序列化為對象就可以通過

DataInfo.Student student1 = DataInfo.Student.parseFrom(bytes);

然后運行該main方法。

?

示例代碼下載

https://download.csdn.net/download/BADAO_LIUMANG_QIZHI/12858952

?

?

?

?

?

總結

以上是生活随笔為你收集整理的ProtoBuf的介绍以及在Java中使用protobuf将对象进行序列化与反序列化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 黄色在线免费播放 | 亚洲国产剧情 | 日本人妖网站 | 亚洲yy| 日本性xxxxx 免费毛片视频网站 | 国产精品人人爽 | 成人一区二区三区四区 | 日本黄网站在线观看 | 天堂网一区 | 天天干在线观看 | 黄色小视频免费网站 | 这里只有精品免费视频 | 91麻豆精品久久久久蜜臀 | 美女av网站 | 亚洲午夜视频 | 毛片毛片毛片毛片毛片毛片毛片毛片毛片毛片 | 免费爱爱网站 | 女人和拘做爰正片视频 | 国产av成人一区二区三区 | 日韩三区在线观看 | 天天色天天操天天射 | 亚洲毛片av| 操碰视频 | 亚洲毛片一级 | 亚洲夜夜夜 | 性史性dvd影片农村毛片 | 久久精品视频1 | 国内自拍偷拍视频 | 久久中文字幕一区二区 | 国产精品福利一区二区三区 | 欧美视频日韩 | 国产高清视频在线播放 | 欧美午夜精品一区二区 | 黑料视频在线观看 | 人人爽人人| 久久久在线免费观看 | 99久久久精品免费观看国产 | 日韩一级片在线 | 日本性爱动漫 | 在线视频资源 | 精品日韩在线 | 国产亚洲欧美在线精品 | 国产香蕉视频在线播放 | av免费在线网站 | 妺妺窝人体色WWW精品 | 天天干天天操天天摸 | 美女扣逼喷水视频 | 欧美脚交视频 | 久久日视频 | 免费黄色在线网站 | 草一色| 国产精品电影 | 人妻在线日韩免费视频 | 色爽爽爽爽爽爽爽爽 | 成人综合婷婷国产精品久久 | 亚洲第一黄色片 | 中文字幕日韩视频 | 亚洲精品乱码久久久久久蜜桃欧美 | 日本少妇bb | 国产精品香蕉 | 三级中文字幕在线 | 精品国产av无码 | 国产手机在线视频 | 天堂在线视频免费 | 91美女啪啪| 青青艹在线观看 | 国产精品一区二区免费 | 美女黄色免费网站 | 丰满双乳秘书被老板狂揉捏 | 亚洲欧美变态另类丝袜第一区 | 国产主播在线播放 | 亚洲色图35p | 影音先锋激情 | 亚洲天堂视频在线观看 | 我们俩电影网mp4动漫官网 | 国产日产欧洲无码视频 | 91在线看黄 | 日本精品久久久久中文字幕 | 秋霞欧美视频 | 中文字幕成人在线 | 影音先锋亚洲资源 | 久久精品视频9 | a级黄色网址 | 无码人妻精品一区二区蜜桃网站 | 亚洲 欧美 中文字幕 | 青青草娱乐视频 | 夜夜操天天干 | 免费搞黄网站 | 国产一区二区三区自拍 | 中文字幕精品视频在线观看 | 裸体一区二区三区 | 日本 奴役 捆绑 受虐狂xxxx | 亚洲涩情 | 久久大陆| 午夜影院性 | 99国产精品国产精品九九 | 黄色二级视频 | 另类视频一区 | 色视频在线观看免费 |