国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

Protobuf筆記以及Java Javascript使用實例

2019-11-08 18:28:49
字體:
來源:轉載
供稿:網友

Google PRotocol Buffer

1.協議介紹:

Google Protocol Buffer是google 的一種數據交換的格式,它獨立于語言,獨立于平臺。google 提供了多種語言的實現:java、c#、c++、go、python、js等,每一種實現都包含了相應語言的編譯器以及庫文件。由于它是一種二進制的格式,比使用 xml 進行數據交換快許多。可以把它用于分布式應用之間的數據通信或者異構環境下的數據交換。作為一種效率和兼容性都很優秀的二進制數據傳輸格式,可以用于諸如網絡傳輸、配置文件、數據存儲等諸多領域。

2.使用說明:

2.1proto文件說明:

不管是同種語言還是不同語言,在使用Protobuf進行數據交互的時候需要統一的一個數據結構。這個數據結構使用.proto后綴,并使用proto的特殊語法進行定義。此文件格式如下:
syntax="proto2" //語法格式 package tutorial; //包 //option:可賦值非必須賦值 java_package:java包名 option java_package = "com.example.tutorial"; //java類名,生成com.example.tutorial.AddressBookProtos java類 option java_outer_classname = "ProtoEntity"; option csharp_namespace = "Google.ProtocolBuffers.Examples.AddressBook"; //message定義所需要序列化的數據的格式。每一個Message都是一個小的信息邏輯單元, //包含了一些列的name-value對。 message Person { required string name = 1; //required必須賦值,是永久性的 required int32 id = 2; // Unique ID number for this person. 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類似數組或集合(java里是list) repeated PhoneNumber phone = 4; } //用戶信息 message UserInfo { optional string userId=1;//用戶id optional string userNickname=2;//用戶昵稱 optional string userPicPath=3;//頭像地址 optional sint64 shopId=4;//商店id optional string tableId=5;//桌臺id optional string clearType=6;//清理類型 optional string orderId=7;//訂單id optional sint64 tag=8;//tag optional sint32 source=9[default=1];//來源 1微信 2pad } // Our address book file is just one of these. message AddressBook { repeated Person person = 1; }
由于Protobuf需要在多種語言之間進行交互,所以對于proto文件中的數據類型定義如下:

數據類型對比

2.2Java使用說明:

2.2.1在Java中使用Protobuf需要注意幾點:

1.java_package屬性:在class生成時,會在相對路徑后加上這個屬性對應的包名,在定義時需要與項目中你希望放Protobuf Class的路徑相同。 2.java_outer_classname屬性:這個屬性是在生成Class后的類名,下面包含的message都是這個class下的內部類。

2.2.2使用說明:

安裝protoc:
windows:首先需要在github的protobuf開源地址下載protoc進行安裝 mac:依次執行brew install automake brew install libtool brew install protobuf
protoc使用:
protoc --java_out=src/main/java/ src/main/resources/proto/shoppingcart.proto

java_out:生成的java文件輸出目錄 后面的指定的是proto文件的地址

2.2.3Usage:

下列使用上面2.1proto文件中的UserInfo對象來進行舉例:

2.2.3.1創建對象:
通過build的方式創建對象: ProtoEntity.UserInfo proUserInfo = ProtoEntity.UserInfo.newBuilder().setTableId("1234").setShopId(1234).setUserId("userid").setUserNickname("測試").setTag(1234444L).build();通過被編譯后的byte[]: ProtoEntity.UserInfo joinRoomUserInfo = ProtoEntity.UserInfo.parseFrom(data.getData());

同時Protobuf的對象parseFrom方法還有通過InputStream和ByteString對象來生成對象的方式。

2.2.3.2序列化對象:
序列化為byte[]: userInfo.toByteArray();

同時,protobuf的每個對象也可以序列化為InputStream和ByteString等。

2.4JS使用說明:

2.4.1Protobuf.js導入方式:

直接下載protobuf下載地址 使用npm install protobuf也可以安裝直接粘貼 <script src="http://cdn.rawgit.com/dcodeIO/protobuf.js/6.6.3/dist/protobuf.js"></script>

2.4.2Usage:

2.4.2.1創建對象:
protobuf.load("./js/proto/shoppingcart.proto", function (err, root) { if (err) throw err; var UserInfo = root.lookup("proto.UserInfo"); var message = UserInfo.create(userinfo); var encodedObj = UserInfo.encode(message).finish();
2.4.2.2序列化對象:
getProtoObj("./js/proto/shoppingcart.proto", "proto.UserInfo", data, function (result) { console.info(result); }); function getProtoObj(protoPath, objName, data, cb) { protobuf.load(protoPath, function (err, root) { if (err) throw err; var info = root.lookup(objName); var result = Uint8Array.from(JSON.parse(data).data);//此時jsprotobuf使用的是無符號byte數組,而java序列化后是帶符號的,所以需要先進行轉換成無符號的byte數組 cb(info.decode(result)) }); }
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 烟台市| 马公市| 义马市| 通渭县| 汕尾市| 阿坝县| 黄平县| 全南县| 拉孜县| 托克托县| 邛崃市| 秦皇岛市| 桑日县| 吉首市| 林芝县| 太康县| 冷水江市| 安国市| 荔波县| 分宜县| 彩票| 沙洋县| 施秉县| 枞阳县| 小金县| 波密县| 天峻县| 灌南县| 大港区| 广昌县| 泸溪县| 闸北区| 万盛区| 宜宾市| 灌阳县| 颍上县| 兰州市| 灵宝市| 福州市| 苍南县| 百色市|