1. 程式人生 > >google protocol buffer——protobuf的問題和改進2

google protocol buffer——protobuf的問題和改進2

這一系列文章主要是對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