JSON - 可能每个人都知道这个轻量的数据格式几乎被用在了所有的现代服务器中。相对于过去流行的一些东西,如可怕的XML,它更轻量,更可读,对开发更友好。JSON是语言独立的数据格式,但解析和格式转化,比如转为Java对象,耗费了我们的时间和内存资源。

几天以前,Facebook宣布,在它的Android app中的数据处理部分获得了巨大的性能提升。那与 几乎在整个app中丢弃JSON格式,而用FlatBuffers代替有关。请参考这篇文章来了解一些关于FlatBuffers的基本知识,以及从JSON转换到它的结果。

尽管结果看上去非常好,但乍一看实现方式不是特别明显。Facebook也没有说太多。那也就是为什么我想在这篇文章中展示我们可以如何使用FlatBuffers。

FlatBuffers

简单地说,FlatBuffers是Google的一个跨平台序列化库,特别为游戏开发创建以及,如Facebook所展示的那样,遵循Android中的流畅的及响应式UI的16ms规则。

但是注意了,在你扔掉一切,将你的所有数据迁移到FlatBuffers之前,请先确认你需要这样做。有时候对性能的影响将是极其微小的,而有时候数据安全性比计算速度上几十毫秒的差异重要得多。

什么使FlatBuffers如此高效?

  • 由于平坦的二进制缓冲区,访问序列化后的数据时无需解析,即使是对于层次式的数据。多亏于这一点,我们不需要初始化解析器(这意味着构造复杂的字段映射),以及解析数据,这也耗费时间。
  • FlatBuffers数据不需要分配多于缓冲区本身所用大小的内存。我们不需要像在JSON中那样,为解析后的层次式数据分配额外的对象。

要获取真实的数字可以参考关于向FlatBuffers迁移的facebook的文章,或者Google文档。

实现

这篇文章将描述在Android app中使用FlatBuffers的最简单的方式:

  • 在app之外的某个地方将JSON数据转换为FlatBUffers格式(比如将二进制文件以文件的形式传送,或直接从API返回)。
  • 通过flatc (FlatBuffer编译器) 手动产生数据模型(Java 类)。
  • JSON文件有一些限制 (不能使用null字段,Data格式被解析为一个String)。

可能在未来我们将准备更复杂的方案。

FlatBuffers编译器

首先我们要先获取flatc - FlatBuffers编译器。它可以通过位于Google的flatbuffers仓库中的源代码来构建。让我们下载/clone它。整个的构建过程在FlatBuffers构建文档中描述。如果你是Mac用户则你需要做的是:

  1. 打开下载的代码中的\{extract directory}\build\XcodeFlatBuffers.xcodeproj这个文件。
  2. 通过点击Play按钮或按下⌘ + R键来运行flatc scheme(应该被选为默认选项)。
  3. flatc可执行文件将出现在工程的根目录。

现在我们可以使用schema编译器(以Java,C#,Python,GO和C++语言)来为给定的模式产生模型类,以及将JSON转换为FlatBuffer二进制文件了。

模式文件

现在我们必须要准备模式文件了,它定义了我们想要 反-/序列化 的数据结构。这个模式将被flatc用于创建Java模型以及从JSON到FlatBuffer二进制文件的转换。

这是我们的JSON文件的一部分:

{"repos": [{"id": 27149168,"name": "acai","full_name": "google/acai","owner": {"login": "google","id": 1342004,..."type": "Organization","site_admin": false},"private": false,"html_url": "https://github.com/google/acai","description": "Testing library for JUnit4 and Guice.",..."watchers": 21,"default_branch": "master"},...]
}

repos_json_fragment.json 位于GitHub

可以在这里获取完整的版本。它是通过调用如下的Github API所获数据经过了一点修改的版本:
https://api.github.com/users/google/repos.

编写FlatBuffer模式文件的文档非常好,因而在这里我就不再深入说明了。在我们的例子中模式文件也不是非常复杂。我们所要做的所有事情就是创建3个表:ReposListRepoUser,并定义root_type。下面是这个模式文件的重要部分:

table ReposList {repos : [Repo];
}table Repo {id : long;name : string;full_name : string;owner : User;//...labels_url : string (deprecated);releases_url : string (deprecated);
}table User {login : string;id : long;avatar_url : string;gravatar_id : string;//...site_admin : bool;
}root_type ReposList;

repos_schema_fragment.fbs 位于GitHub

完整的模式文件在这里。

FlatBuffers数据文件

很好,现在我们所需要做的就是将repos_json.json转换为FlatBuffers二进制文件,并产生Java模型,其可以以Java友好的方式表示我们的数据(这个操作所需的所有的所有文件可以在我们的repository获取):

$ ./flatc -j -b repos_schema.fbs repos_json.json

如果一切顺利,这将产生如下的文件:

  • repos_json.bin (将被重命名为repos_flat.bin)
  • Repos/Repo.java
  • Repos/ReposList.java
  • Repos/User.java

Android app

现在让我们来创建我们的示例app,来看下FlatBuffers格式是如何在实际中使用的。这是它的截屏:

screenshot.png

ProgressBar将仅被用于展示不正确的数据处理(在UI线程中)可以如何影响用户界面的流畅度。

我们的app的app/build.gradle文件看起来如下面这样:

apply plugin: 'com.android.application'
apply plugin: 'com.jakewharton.hugo'android {compileSdkVersion 22buildToolsVersion "23.0.0 rc2"defaultConfig {applicationId "frogermcs.io.flatbuffs"minSdkVersion 15targetSdkVersion 22versionCode 1versionName "1.0"}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}}
}dependencies {compile fileTree(dir: 'libs', include: ['*.jar'])compile 'com.android.support:appcompat-v7:22.2.1'compile 'com.google.code.gson:gson:2.3.1'compile 'com.jakewharton:butterknife:7.0.1'compile 'io.reactivex:rxjava:1.0.10'compile 'io.reactivex:rxandroid:1.0.0'
}

当然,在我们的例子中没必要使用Rx或ButterKnife,但为什么不让这个app更好一点呢

在Android中使用FlatBuffers - 简介相关推荐

  1. android build.ninja,Android中的Ninja简介

    Android中的Ninja简介 2017-08-15 16:49:42 +08 字数:2671 标签: Android Makefile Ninja 如果说Makefile是一个DSL,那么Ninj ...

  2. 在Android中使用FlatBuffers

    总览 先来看一下 FlatBuffers 项目已经为我们提供了什么,而我们在将 FlatBuffers 用到我们的项目中时又需要做什么的整体流程.如下图: :.jpg 在使用 FlatBuffers ...

  3. Android 中的多线程简介

    一.概念讲解 进程:是程序运行过程中系统进行资源分配和调度的一个独立单位,使多个程序可 并发执行,以提高系统的资源利用率和吞吐量. 线程:一个基本的CPU执行单元 & 程序执行流的最小单元. ...

  4. android 蓝牙相关的类,Android中BluetoothAdapter类简介

    一. BluetoothAdapter类介绍 BluetoothAdapter类简单点来说就是代表了本设备(手机.电脑等)的蓝牙适配器对象,通过它我们可以蓝牙设备进行基本 开发了,主要有如下功能: 1 ...

  5. Android中的StrictMode简介

    .build()); 当然,以上代码只应在未发布上线的测试版本的应用中运行以方便监视相关的运行情况,当在生产版本上时不应该启用strictmode.因此,最佳的代码实践应该为如下的样子: public ...

  6. 【Android 安装包优化】Android 中使用 SVG 图片 ( SVG 矢量图简介 | Android 中生成 Vector 矢量图资源 )

    文章目录 一.SVG 矢量图简介 二.Android 中生成 Vector 矢量图资源 三.参考资料 一.SVG 矢量图简介 Android SVG 参考文档 : https://developer. ...

  7. Android中ADB-server、ADB-client和adbd的简介

    Android中ADB-server.ADB-client和adbd的简介 来源 AI 时间 1年前     本站文章,部分收集于互联网,若有侵权问题敬请告知,谢谢 本文主要是介绍Android中An ...

  8. android中SELINUX规则分析和语法简介

    点击打开链接 1. SELINUX是可以理解为一种Android上面的安全机制,是有美国国家安全局和一些公司设计的一个针对linux的安全加强系统 我们可以通过配置SELINUX的相关policy,来 ...

  9. Android中三种常用解析XML的方式(DOM、SAX、PULL)简介及区别

    XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能.今天就由我向大家介绍一下在Android平台下几种常见的XML解 ...

最新文章

  1. Linux脚本中$#、$0、$1、$@、$*、$$、$?
  2. 初学C语言,你的“行囊”需要准备什么呢?
  3. linux红帽子怎么配置dhcp,LinuxDHCP的高级配置如何应用呢?
  4. react学习(18)----vs 全局搜索
  5. Shell脚本/bin/bash^M: bad interpreter错误解决方法
  6. Going to 的将来时态_47
  7. Linux系统分区及LVM使用(一)
  8. 死锁(Deadlock)
  9. JavaScript 将死?
  10. sqlserver垮库查询_sql跨库查询(sqlserver跨库查询)
  11. 江湖二三事:听说你想做数据分析师?
  12. 如何用计算机截部分屏,电脑怎样截长屏_电脑如何长截屏截图-win7之家
  13. 迅为IMX6ULL开发板Linux RS232/485驱动实验(上)
  14. HEVC—SAO技术
  15. MySQL通过frm和idb恢复数据库的方法
  16. swoole安装教程人人商城互动直播通信服务启用教程
  17. 贪心 阿狸和桃子的游戏
  18. 诸葛智能荣登《2022中国企业数智化转型升级创新服务企业》榜单!
  19. 1.Matlab 画图输出 EPS 格式文件中文出现乱码
  20. 洛谷学习笔记P1008

热门文章

  1. Filter_细节_过滤器链(多个过滤器)
  2. 编译原理 python_Python局部变量编译原理
  3. c语言 变量 定义 使用,C语言为什么要规定对所用到的变量要“先定义,后使用”...
  4. mysql使用常量列_MySQL 执行计划
  5. 201029阶段二Linux动态库、makefile
  6. 设计模式C++实现--Interpreter模式
  7. varnish缓存服务器构建疑问
  8. 一起学设计模式 - 单例模式
  9. top.location.href和localtion.href有什么不同
  10. 存储变革 IBM V5000四大优势助用户破旧立新