阅读更多
JSON——大家可能都知道它是几乎所有现代服务器都使用的轻量级数据交换格式。它体量轻,可读性强,通常比老式的、不友好的XML开发起来更加便捷友好。JSON是不依赖于开发语言的数据格式,但是在解析数据并将其转换到如Java对象时,会消耗我们的时间和存储资源。

几天前,Facebook宣布,其Android应用程序大幅提升了数据处理性能。这是由于几乎在全部应用程序中放弃了JSON数据格式,用FlatBuffers取而代之了。阅读这篇文章可以获得关于FlatBuffers的基础知识,学会如何从JSON转换到FlatBuffers。

虽然这东西是非常有前景的,但是乍一看其实现过程不是一下子就能明白的。而且Facebook也没有说得很详细。这就是为什么我要写这篇文章,在其中展示我们是如何使用Flatbuffers开展工作的。

FlatBuffers

总之,FlatBuffers是Google专门为游戏开发而创建的跨平台序列化库,就像Facebook所展示的那样,它在Android平台上遵循快速响应UI的16ms规则

但是,在把所有数据迁移到FlatBuffers之前,你要确定确实需要这样做。因为,这样做有时对性能的影响是潜移默化的,而且数据安全性要比计算速度上几十毫秒的差异更重要。

什么使得Flatbuffers如此奏效?
  • 由于是以二进制形式缓存,访问序列化数据时也无需数据解析过程。即使对于层次化数据也不需要解析。多亏不需要初始化解析器(初始化意味着要建立复杂的字段映射)和解析数据,这些都是需要花费时间的。
  • Flatbuffers数据不需要分配比自身使用缓冲区还要多的内存。我们不必像在JSON中那样为解析数据的整个层次分配额外对象。

要获得正宗的数据,就再读一读Facebook上关于FlatBuffers迁移问题的文章,还有Google自己的文档。

实现

本文将介绍在Android应用程序中使用Flatbuffers的最简单方法:

  • JSON数据在应用程序之外的某个地方被转换成FlatBuffer格式的文件(例如,将二进制数据以文件的形式提交,还可以从API直接返回FlatBuffer二进制文件)。
  • 在flatc (FlatBuffer编译器)的帮助下,手工生成数据模型(Java类)。
  • JSON文件存在一定的局限性(不能使用null字段,日期格式也被解析为字符串)。

将来,我们或许会提出更复杂的解决方案。

FlatBuffers编译器

首先,我们需要flatc,即flatbuffers编译器。该编译器可以从Google所属的源代码构建,源代码位于Flatbuffers资源库中。我们下载并克隆它。整个构建过程在FlatBuffers构建文档中都做了描述。如果你是Mac用户的话,需要这样来构建:

1.在\{extract directory}\build\XcodeFlatBuffers.xcodeproj路径下,打开已下载的源代码。
2.点击Play按钮或⌘ + R,运行flatc scheme(默认情况下应该是被选中的)。
3.flatc可执行文件就会在项目的根目录下出现。
现在,我们可以使用schema编译器了,该编译器能够把给定的schema(在Java、C#、Python、GO和C++语言中的schema)生成为模型类,还可以把JSON转换成Flatbuffer的二进制文件。

Schema文件

接着,我们必须准备schema文件,该文件定义了要进行序列化和反序列化的数据结构。这个schema将用于flatc创建Java模型,把JSON转换成FlatBuffers的二进制文件。

这里是JSON文件的一部分。

完整版本在这里。这是略微修改后的版本,可以从Github API调用:https://api.github.com/users/google/repos

Flatbuffer schema是编写得很好的文档,所以就不深入探讨这个问题了。另外,本文中的schema不会很复杂。我们所要做的仅仅是创建3张表:ReposList, Repo和User,并定义root_type。这是schema的重要组成部分。

完整的schema文件在这里

FlatBuffers数据文件

真棒,我们现在要做的是把repos_json.json转换成FlatBuffers二进制文件,生成能够以Java风格表示数据的Java模型(此处操作所需的全部文件都在我们的代码库中):
$ ./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应用程序
现在来创建示例程序,在实践中来看看Flatbuffers格式是如何起作用的。这是截图:



在UI部分,ProgressBar仅用于显示不恰当的数据处理对用户界面顺畅度的影响。

应用文件看起来是这个样子:app/build.gradle

当然,在本例中不是必须要用Rx或ButterKnife这样的视图注入利器,但是为什么不让应用更细致一些呢??

我们把repos_flat.bin 和 repos_json.json文件放到res/raw/目录下。RawDataReader是工具类,它帮助我们读取Android应用中的原始文件。

最后,把Repo,ReposList和User这三张表对应的模型类代码放到项目源代码中。

FlatBuffers库

使用Java语言编程过程中,FlatBuffers提供了可以直接处理这种数据格式的库,也这是flatbuffers-java-1.2.0-SNAPSHOT.jar文件。如果你想手工生成该文件,需要下载FlatBuffers源代码,再到目录java/下,用Maven生成该库:
$ mvn install

现在将.jar文件放到Android项目的app/libs/目录下。

好了,当务之急是实现MainActivity类,这是完整源代码。

我们最为关注的两个方法是:
  • parseReposListJson(String reposStr) - 这个方法初始化Gson解析器,并把JSON字符串转换成Java对象。
  • loadFlatBuffer(byte[] bytes)  - 这个方法将字节(repos_flat.bin文件)转换成Java对象。

使用FlatBuffers的结果

现在让我们把JSON和FlatBuffers在加载时间和资源消耗方面的差异形象化。测试是在带有Android M(beta版)的Nexus 5上进行的。

使用FlatBuffers的结果

现在让我们把JSON和FlatBuffers在加载时间和资源消耗方面的差异形象化。测试是在带有Android M(beta版)的Nexus 5上进行的。

加载时间

测量的过程是将其他文件转换为Java源文件,对所有(90个)元素进行迭代。
  • 使用JSON:JSON文件(大小:478kB)平均加载时间200ms(时间区间:180ms~250ms);
  • 使用FlatBuffers:FlatBuffers二进制文件(大小:352kB)平均加载时间5ms(时间区间:3ms~10ms)。

记得16ms规则吗?我们在UI线程中调用这些方法的原因就是要看看在这种情况下界面表现如何:

JSON数据加载效果:




FlatBuffers数据加载效果:



看出区别了吗?JSON数据的加载过程中, ProgressBar停顿了一会,界面不是那么顺畅(加载时间超过了16ms)。

内存分配、CPU等资源

还有什么想要测量的吗?也许应该测量一下Android Studio 1.3,还有那些新特性。例如,内存分配跟踪器(Allocation Tracker),内存状态查看器(Memory Viewer)和方法跟踪器(Method Tracer)。

源代码

这里所讲解项目的完整源代码都在Github代码库中。你不需要接触整个FlatBuffers项目,所需的内容全都在flatbuffers/目录下。(翻译/张挥戈  友情审校/白云鹏)

文章来源:froger_mcs dev blog

作者简介:

Miroslaw Stanek,Azimo Money Transfer公司移动项目负责人,Android和iOS平台程序员,视频游戏玩家,冰雪运动爱好者。个人博客:http://frogermcs.github.io。

译者简介:

张挥戈,长期从事计算机软件开发、项目管理和产品设计工作,曾在多家移动互联网公司任技术总监。关注Android平台相关技术以及其他平台客户端软件开发相关话题。
  • 大小: 41.5 KB
  • 大小: 57.3 KB
  • 大小: 68.1 KB
来自: CSDN
1
0
评论 共 1 条 请登录后发表评论
1 楼 abc-127 2015-09-08 10:49
好像都没有什么例子 baidu半天都是介绍 java 后台怎么用?

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • FlatBuffers:高效内存序列化库-开源

    FlatBuffers是一个开放源代码,跨平台的序列化库,旨在最大程度地提高内存效率。 FlatBuffers最初由Google创建,用于游戏开发和其他对性能有严格要求的应用程序,它具有独特的功能,可让您直接访问序列化数据,而...

  • Google高效开源跨平台序列化库FlatBuffers 1.1发布

    经过几个月开发,FlatBuffers 1.1版本更新。这次的更新包含: 对Java API进行了广泛的检修 out-of-the-box支持C#和Go 一个可选的校对器,使FlatBuffers在不可信的情况下变得实用 原型解析更容易从协议缓冲区迁移 ...

  • Google高效开源跨平台序列化库FlatBuffers 1.1新特性

    FlatBuffers相对ProtocolBuffer的优势是:无需反序列化,但代价是encode之后的体积相对ProtocolBuffer更大 原文:http://geek.csdn.net/news/detail/29744   经过几个月开发,FlatBuffers 1.1版本更新。这次的...

  • 谷歌开源高效、跨平台的序列化库FlatBuffers

    近日,谷歌“Fun Propulsion Labs”团队开源了FlatBuffers。该库的构建是专门为游戏开发人员的性能需求提供支持,它将序列化数据存储在缓存中,这些数据既可以存储在文件中,又可以通过网络原样传输,而不需要任何...

  • Google FlatBuffers——开源、跨平台的新一代序列化工具

    前段时间刚试用了一个序列化工具cereal,请看 cereal:C++实现的开源序列化库,打算再总结下我对google proto buf序列化库的使用呢, 结果还没动手,大Google又出...FlatBuffers是一个开源的、跨平台的、高效的、提供

  • 深入浅出FlatBuffers原理

    简介:FlatBuffers 是一个开源的、跨平台的、高效的、提供了多种语言接口的序列化工具库。实现了与 Protocal Buffers 类似的序列化格式。主要由 Wouter van Oortmerssen 编写,并由 Google 开源。本文将基于高德地图...

  • C++跨平台开源库 之二

    开源、免费,不依赖第三方库,支持跨平台。 http://www.cs.wustl.edu/~schmidt/ACE.html   (2)Asio Asio基于Boost开发的异步IO库,封装了Socket,简化基于socket程序的开发。 开源、免费,支持跨平台。 ...

  • FlatBuffers学习

    FlatBuffers学习 1.为什么使用FlatBuffers 使用FlatBuffers的原因很简单,那就是简单、效率高和便利。 为了传输数据,我们做了不少努力,研制出不少编解码方法,如:BER、PER、JSON、BSON、XML、HTML等。然而,...

  • fastFFI 官宣开源,一款高效的 Java 跨语言通信框架

    fastFFI 是一个现代高效的 FFI 框架,其开发初衷是提高不同语言之间相互通信的易用性与性能,目前的实现主要是针对 Java 访问 C++ 代码和数据。不同程序设计语言擅长解决不同的问题,因此跨语言调用的需求在现代软件...

  • TFLite: flatbuffers

    FlatBuffers 是一个序列化开源库,实现了与 Protocol Buffers,Thrift,Apache Avro,SBE 和 Cap'n Proto 类似的序列化格式,主要由 Wouter van Oortmerssen 编写,并由 Google 开源。Oortmerssen 最初为 Android ...

  • 开源巨献:Google最热门60款开源项目

    本文为大家整理了 Google 开源的热门项目,排名顺序按照 Github ★Star 数排列。 0、机器学习系统 TensorFlow ★Star 62533 TensorFlow 是谷歌的第二代机器学习系统,按照谷歌所说,在某些基准测试中,...

  • 深入浅出 FlatBuffers 原理

    FlatBuffers 是一个开源的、跨平台的、高效的、提供了多种语言接口的序列化工具库。实现了与 Protocal Buffers 类似的序列化格式。主要由 Wouter van Oortmerssen 编写,并由 Google 开源。Oortmerssen 最初为 ...

  • go 生成基于 graphql 服务器库.zip

    格奇尔根 首页 > 文件 > gqlgen是什么?gqlgen是一个 Go 库,用于轻松构建 GraphQL 服务器。gqlgen 基于 Schema 优先方法— 您可以使用 GraphQL Schema 定义语言来定义您的 API 。gqlgen 优先考虑类型安全— 您永远不应该看到map[string]interface{}这里。gqlgen 启用 Codegen — 我们生成无聊的部分,以便您可以专注于快速构建您的应用程序。还不太确定如何使用gqlgen?将gqlgen与其他 Go graphql实现进行比较快速启动初始化一个新的 go 模块mkdir examplecd examplego mod init example添加github.com/99designs/gqlgen到项目的 tools.goprintf '//go:build tools\npackage tools\nimport (_ "github.com/99designs/gqlgen"\n _ "github.com/99designs/gqlgen

  • 基于JAVA+SpringBoot+Vue+MySQL的社区物资交易互助平台 源码+数据库+论文(高分毕业设计).zip

    项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea 数据库:MySql8.0 部署环境:maven 数据库工具:navicat

  • 法研杯2021类案检索赛道三等奖方案源码+项目说明+数据.zip

    法研杯2021类案检索赛道三等奖方案源码+项目说明+数据.zip是一个专为计算机相关专业(如计科、信息安全、数据科学与大数据技术等)学生设计的宝贵学习资源。该压缩包包含了完整的项目源码、详细的项目说明文档以及用于训练和测试的数据集,旨在帮助参赛者深入理解并掌握类案检索的相关技术和方法。该项目通过实际案例,展示了如何运用自然语言处理和机器学习技术对法律案件进行智能检索和匹配。项目内容涵盖了从数据预处理、特征提取到模型训练和评估的全过程,为学习和研究类案检索技术提供了全面的参考。本项目不仅适合作为课程设计、期末大作业或毕设项目的参考,也是企业员工提升技能、进行实践操作的优质学习资料。通过实际操作和学习该项目,用户可以加深对类案检索技术的理解,并在实践中不断提升自己的技能水平。请注意,由于该资源包含完整的项目源码和数据集,下载和使用时请确保遵守相关法律法规和道德规范,尊重知识产权和隐私权。同时,建议用户在使用前仔细阅读项目说明文档,了解项目的整体架构和使用方法,以便更好地利用该资源进行学习和研究。

  • 基于Cesium实现的对倾斜摄影模型的单体化分层方案源码.zip

    本资源提供了基于Cesium实现的倾斜摄影模型单体化分层方案的完整源码,旨在帮助开发者深入理解并实践三维地理空间数据的处理与展示。通过Cesium平台,用户能够将倾斜摄影获取的高精度三维模型进行单体化和分层处理,实现对模型中每个独立元素的精细管理和交互操作。该资源适合具备一定计算机编程基础的学习者,特别是对Cesium感兴趣的学生、研究人员及GIS行业从业者。通过下载并学习这些源码,用户可以掌握倾斜摄影模型在Cesium中的加载、单体化以及分层显示等关键技术,进而提升自己在三维地理信息系统开发领域的技能水平。

  • Go 的 PostgreSQL 驱动程序和工具包.zip

    Go 的 PostgreSQL 驱动程序和工具包 pgx - PostgreSQL 驱动程序和工具包pgx 是 PostgreSQL 的纯 Go 驱动程序和工具包。pgx 驱动程序是一个低级、高性能接口,它公开了 PostgreSQL 特定的功能,例如LISTEN/ NOTIFY和COPY。它还包括一个标准database/sql接口的适配器。工具包组件是一组相关的软件包,用于实现 PostgreSQL 功能,例如解析线路协议以及 PostgreSQL 与 Go 之间的类型映射。这些底层软件包可用于实现替代驱动程序、代理、负载均衡器、逻辑复制客户端等。示例用法package mainimport ( "context" "fmt" "os" "github.com/jackc/pgx/v5")func main() { // urlExample := "postgres://username:password@localhost:5432/database_name" conn, err := pgx.Connect(context.B

  • C#ASP.NET中小型超市管理系统源码数据库 SQL2012源码类型 WinForm

    ASP.NET中小型超市管理系统源码 超市管理系统是专门为中小型超市打造的管理系统,可以方便管理时更加准确清晰的查看商品信息, 仓库出售与进货的信息,还有每一个部门员工的信息,也更加直观的体现出每一阶段的商品销售情况; 从而提高项目管理水平,实现了工作的协同化、提高了工作效率 二、功能介绍 1.1 UI Requirements界面要求 (1)界面美观,给用户一种很舒心的感觉。 (2)界面所体现出的功能清晰明了,让用户一目了然。 (3)界面的背景颜色搭配符合超市管理系统界面的设计理念。 1.2 UI Requirements界面要求 (1) 使用ADO.NET与数据库交互制作 (2) 使用Visual Studio设计窗体布局 (3) 使用提供的用控件快速开发 1.3 Development Environment 开发环境 (1) 开发工具:Visua

  • 毕设&课程作业_基于C#的易知仓库管理系统.zip

    计算机系毕业设计

Global site tag (gtag.js) - Google Analytics