天天看點

Android 上的資料格式 FlatBuffers 介紹

<b>本文講的是Android 上的資料格式 FlatBuffers 介紹,</b>

<b></b>

雖然這個結果非常激動人心,但咋一看如何使用不是很明顯,Facebook 沒有對實作進行過多的說明。這也是我發表這篇文章的原因,我将在文章中說明如何使用 FlatBuffers 來開始我們的工作。

什麼原因使得 FlatBuffers 如此高效?

因為有了扁平二進制緩沖區,通路序列化資料甚至層級資料都不要解析。歸功于此,我們不需要花費時間去初始化解析器(意味着建構複雜的字段映射)和解析資料。

FlatBuffers 資料相比使用自己的緩沖區,不需要配置設定其他更多的記憶體。我們不需要像 JSON 那樣在解析資料的時候,為整個層級資料配置設定額外的記憶體對象。

該文将介紹在 Android app 中使用 FlatBuffers 最簡單的方法。

在app項目以外的_某個地方_,JSON 資料将被轉換成 FlatBuffers 格式的資料(如,API 會傳回一個二進制檔案或者目錄)

資料模型(Java 類)是使用 flatc(FlatBuffers 編譯器)手動生成的

對 JSON 檔案的一些限制條件(不能使用空字段,日期類型将被解析成字元串類型)

不久後,我們可能準備介紹一些更複雜的解決方法。

進入下載下傳好了的源碼目錄 <code>\{extract directory}\build\XcodeFlatBuffers.xcodeproj</code>

按下 Play 按鈕或者<code>⌘ + R</code>快捷鍵運作 flatc 結構描述檔案(預設會被選中)

運作完成後,flatc 可執行檔案将會出現在項目的根目錄中

現在我們準備一份結構描述檔案,該檔案定義了我們想要序列化/反序列化的資料結構。我們使用該檔案和 flatc 工具,去生成 Java 資料模型并将 JSON 格式的檔案轉換成 FlatBuffer 格式的二進制檔案。

JSON 檔案的部分代碼如下所示:

<code>$ ./flatc -j -b repos_schema.fbs repos_json.json</code>

如果一切順利,将生成以下檔案清單:

repos_json.bin (我們将把該檔案重命名成 repos_flat.bin)

Repos/Repo.java

Repos/ReposList.java

Repos/User.java

Android 上的資料格式 FlatBuffers 介紹

ProgressBar 用來展示不正确的資料處理(在 UI 主線程中)将會對使用者界面的平滑性産生怎樣的影響。

本程式中的 <code>app/build.gradle</code> 檔案如下所示:

當然,你沒有必要在該示例程式中使用 RxJava 或 ButterKnife 庫,但是,我們為什麼不使用他們來使得我們的程式變得更好一點呢  ?

将 repos_flat.bin 檔案和 repos_json.json 檔案放在項目的<code>res/raw/</code>目錄。

最後,将 <code>Repo</code>,<code>ReposList</code> 和 <code>User</code> 檔案放在項目源碼的某個地方。

<code>$ mvn install</code>

現在,将.jar檔案放在Android項目的 <code>app/libs/</code> 目錄下。

好,現在我們所需要做的是去實作 <code>MainActivity</code> 類,該檔案的完整代碼如下所示:

我們應該重點關心的方法:

<code>parseReposListJson(String reposStr)</code> - 該方法初始化 Gson 解析器,并将 json 字元串轉換成 Java 實體類

<code>loadFlatBuffer(byte[] bytes)</code> - 該方法将位元組碼檔案(我們的 repos_flat.bin 檔案)轉換成 Java 實體類

現在,讓我們看看分别使用 JSON 和 FlatBuffers 來解析資料時,在加載時間和消耗資源方面的差別。測試在運作 Android M (beta) 系統的 Nexus 5 手機中進行。

評價标準是将全部元素(90 個)轉換成對應的 Java 檔案。

JSON - 平均加載時間為 200ms(波動範圍在:180ms - 250ms),JSON 檔案大小:478kb。FlatBuffers - 平均加載時間為 5ms (波動範圍在: 3ms - 10ms),FlatBuffers 二進制檔案大小:362kb。

Android 上的資料格式 FlatBuffers 介紹
Android 上的資料格式 FlatBuffers 介紹

看到差別了嗎?當使用 JSON 加載資料時,ProgressBar 明顯凍住了一會兒,這使得我們的界面不舒服(操作耗時超過了 16ms)。

<b>原文釋出時間為:2016年01月07日</b>

<b>本文來自雲栖社群合作夥伴掘金,了解相關資訊可以關注掘金網站。</b>