㈠ android 怎麼使用flatbuffers
在Android應用程序中使用Flatbuffers的最簡單方法:
JSON數據在應用程序之外的某個地方被轉換成FlatBuffer格式的文件(例如,將二進制數據以文件的形式提交,還可以從API直接返回FlatBuffer二進制文件)。
在flatc (FlatBuffer編譯器)的幫助下,手工生成數據模型(Java類)。
JSON文件存在一定的局限性(不能使用null欄位,日期格式也被解析為字元串)。
將來,我們或許會提出更復雜的解決方案。
FlatBuffers編譯器
首先,我們需要flatc,即flatbuffers編譯器。該編譯器可以從Google所屬的源代碼構建,源代碼位於Flatbuffers資源庫中。我們下載並克隆它。整個構建過程在FlatBuffers構建文檔中都做了描述。如果你是Mac用戶的話,需要這樣來構建:
在\{extract directory}\build\XcodeFlatBuffers.xcodeproj路徑下,打開已下載的源代碼。
點擊Play按鈕或⌘ + R,運行flatc scheme(默認情況下應該是被選中的)。
flatc可執行文件就會在項目的根目錄下出現。
現在,我們可以使用schema編譯器了,該編譯器能夠把給定的schema(在Java、C#、Python、GO和C++語言中的schema)生成為模型類,還可以把JSON轉換成Flatbuffer的二進制文件。
Schema文件
接著,我們必須准備schema文件,該文件定義了要進行序列化和反序列化的數據結構。這個schema將用於flatc創建Java模型,把JSON轉換成FlatBuffers的二進制文件。
㈡ 安卓開發 FlatBuffers能夠替代JSON 嗎
FlatBuffers vs JSON
你也許會問:既然我們已經有了標準的JSON、GSON和Jackson,為何還要使用新的工具呢?
你不妨試試FlatBuffers,你就會發它們比JSON快多了。
FlatBuffers是什麼?
FlatBuffers是一個跨平台標准化的C++、C#、C、Go、Java、JavaScript、PHP和Python庫。它們最早由谷歌創立,用來開發游戲和其他一些需要高性能的程序。
為什麼使用latBuffers?
無需分解/拆包就能使用序列化數據——FlatBuffers最大的特點,就是它可以在二進制文件緩沖區內代表分層數據,也就是說,在無需分解和拆包的情況下,它們就可以被使用,而且同時支持數據架構演變(支持向前和向後)。
內存效率與速度——獲取數據所需的唯一內存,就是緩沖內存。它不需要任何額外的內存分配(至少在C++中不需要。其它語言可能會有所不同)。
FlatBuffers還適用於mmap,內存只需要緩沖的一部分。數據使用的速度接近原架構,只需要一個額外的間接引用來允許格式演化和非強制性欄位。
FlatBuffers瞄準的是那些消耗大量時間和空間(許多許多的內存分配)的項目,它讓這些項目可以使用或架構那些不受歡迎的序列號數據,例如
FlatBuffers可以運用在游戲,或是其他需要消耗性能的應用中。
靈活性——擁有非強制性欄位意味著你不僅可以獲得優秀的前進和後退能力(在游戲中非常重要,你無需再每一個新版本中對所有數據都進行更新),還意味著你在數據寫入和放棄方面,你擁有了更多的選擇,在設計數據結構上面,你也有更多的選擇。
對代碼數量需求低——FlatBuffers只需要很少的代碼,以及非常易於真核的單一小標題作為最小依賴。
編寫簡單——在使用的時候,錯誤在編寫階段就能體現出來,而不需要你進行反復的代碼編寫,也不需要進行運行時檢查。它還會為你生成一些有用的代碼。
使用方便——它所生成的C++代碼便於訪問,可用在結構代碼中。它還有一個用於分解綱要的可選功能,以及類似JSON的文本表達功能,可以在運行時有效運轉(相比JSON分解器速度更快,對內存的使用率也更高)。
跨平台,無依賴——C++代碼可以兼容任何最近的gcc/clang和VS2010。它還內置了一個用於測試和樣品的構建文件(安卓.mk文件,以及支持所有其他平台的cmake文件)。
是誰在使用FlatBuffers
BobbleApp是印度最受歡迎的表情貼紙應用。他們在使用FlatBuffers的過程中,大幅的提升了應用的性能。Cocos2d-x是排名第一的開源移動游戲引擎,他們也在使用Cocos2d-x來將游戲數據進行序列化處理。
Facebook也在使用FlatBuffers,他們用它來構建安卓應用中的客戶服務溝通功能。他們曾經發布了一篇文章,講述FlatBuffers對他們的幫助。
谷歌的Fun Propulsion Labs使用FlatBuffers在庫和游戲的開發中大量使用FlatBuffers。
應用性能有多大的提升?
分解速度方面,在JSON上處理20KB的數據需要35毫秒,超過了UI框架刷新的間隔(16.6毫秒)。在使用JSON的時候,我們無法給用戶帶來順滑的應用體驗,他們在滾動UI的時候,會感到明顯的延遲。
分解初始化方面。JSON的分解器需要在分解前構建field mapping,通常需要100-200毫秒。這會大大延長應用的啟動時間。
垃圾收集方面,在JSON進行分解的過程中,會產生大量小對象,我們發現,當JSON對20KB的數據進行分解的時候,需要為其指派100KB的內存空間,這個Java的垃圾收集器造成了巨大的壓力。
FlatBuffer vs JSON
我
曾經做過這樣的實驗,分別用FlatBuffer和JSON對4mb的文件進行分解,FlatBuffer需要1-5毫秒,而JSON需要2000毫秒。
在使用FlatBuffer的時候,應用無需調用GC;而在使用JSON的時候,GC需要被調用多次。因此,在使用JSON的時候,應用UI凍結,我只能
選在在背景中讓JSON完成分解。