google protocol buffer——protobuf的問題和改進2
阿新 • • 發佈:2020-09-20
這一系列文章主要是對protocol buffer這種編碼格式的使用方式、特點、使用技巧進行說明,並在原生protobuf的基礎上進行擴充套件和優化,使得它能更好地為我們服務。
在上一篇文章中,我們舉例了在移動網際網路場景下原生protobuf類庫使用上的問題,並且自己完成了一個java的編碼類庫。本文中將展示swift版本的解碼類庫,並且用網路請求的demo來模擬實際的使用場景,最後再進一步優化protobuf的編碼過程
本文包括以下幾個部分
1.swift版本的解碼類庫實現,這裡要特別說明,因為大部分情況下請求引數的資料量是不大的,所以優先關心返回引數的解碼
2.用網路請求模擬實際的使用場景,包括java和swift
3.根據移動網際網路應用場景的特點進一步優化protobuf的編碼過程
## Swift解碼類庫
因為swift也是一個強型別語言,所以主要思路和java的完全一致,包括所有的基礎演算法都是從java那裡搬過來的,因此大部分程式碼都會比較類似。不過swift和java相比比較大的區別是對於反射的支援並不是很好,所以在模型定義上會有一些限制。
#### **1.模型定義**
為了能正常使用反射,需要將模型和其中的欄位定義為***@objc***,且類需要實現***NSObject***介面,另外為了方便轉換json,類還需要實現***Codable***介面
在上一篇文章最後,我們做了一個模型的測試CoderTestStudent,這裡就在swfit中定義同樣一個模型
```swift
import Cocoa
@objc class CoderTestStudent:NSObject,Codable{
@objc var age:Int = 0
@objc var father:Parent
@objc var friends:[String]
@objc var hairCount:Int64 = 0
@objc var height:Double = 0
@objc var hobbies:[Hobby]
@objc var isMale:Bool
@objc var mother:Parent
@objc var name:String?
@objc var weight:Float
}
@objc class Parent:NSObject,Codable{
@objc var age:Int = 0
@objc var name:String?
}
@objc class Hobby:NSObject,Codable {
@objc var cost:Int = 0
@objc var name:String?
}
```
#### **2.類的定義和入口方法**
首先是入口方法,這裡思路和java類庫一樣,首先需要一個入口方法接收2個引數,*編碼後的位元組陣列data*和*物件的型別typeT*
```swift
class Decoder: NSObject{
...
func des