美文网首页Android性能优化
网络传输优化----flatBuffer

网络传输优化----flatBuffer

作者: 田间小鹿 | 来源:发表于2017-07-11 18:03 被阅读0次

1.优点

优点

2.使用方法

使用方法
//包名
namespace com.xx.xx;
table Items {
    ItemId : long;
    timestemp : int;
    basic:[Basic];
}
 
table Basic{
  id:int;
  name:string;
  email:int;
  code:long;
  isVip:bool;
  count:int;
  carList:[Car];
}
 
table Car{
  id:long;
  number:long;
  describle:string;
}
 
root_type Items;
  • 使用工具
1. 工具使用

2.根据json生成和fbs 生成flatbuffer 二进制文件.bin
例如repos_json.json (有数据),对应的数据结构repos_schema.fbs ,生成repos_json.bin(二进制flatbuffer格式的)
$ ./flatc -j -b repos_schema.fbs repos_json.json

  • 工程中使用
    编写对应描述文件,翻译成对应语言的类。把对应的类, 放到你的工程中。
工程
  • 序列化于反序列化
public void serialize(View v){
    //==================序列化========================
    FlatBufferBuilder builder = new FlatBufferBuilder();
    int id1 = builder.createString("兰博基尼");
    //准备Car对象
    int car1 = Car.createCar(builder,10001L,88888L,id1);
    int id2 = builder.createString("奥迪A8");
    //准备Car对象
    int car2 = Car.createCar(builder,10001L,88888L,id2);
    int id3 = builder.createString("奥迪A9");
    //准备Car对象
    int car3 = Car.createCar(builder,10001L,88888L,id3);

    int[] cars = new int[3];
    cars[0]= car1;
    cars[1] = car2;
    cars[2] = car3;

    //创建Basic对象里面的Car集合
    int carList = Basic.createCarListVector(builder,cars);

    int name = builder.createString("jack");
    int email = builder.createString("jack@qq.com");
    int basic = Basic.createBasic(builder,10,name,email,100L,true,100,carList);
    int basicOffset = Items.createBasicVector(builder,new int[]{basic});
    Items.startItems(builder);
    Items.addItemId(builder,1000L);
    Items.addTimestemp(builder,2016);
    Items.addBasic(builder,basicOffset);

    int rootItems = Items.endItems(builder);
    Items.finishItemsBuffer(builder,rootItems);

    //============保存数据到文件=================
    File sdcard = Environment.getExternalStorageDirectory();
    //保存的路径
    File file = new File(sdcard,"Items.txt");
    if(file.exists()){
        file.delete();
    }
    ByteBuffer data = builder.dataBuffer();
    FileOutputStream out = null;
    FileChannel channel = null;
    try {
        out = new FileOutputStream(file);
        channel = out.getChannel();
        while(data.hasRemaining()){
            channel.write(data);
        }

    } catch (Exception e) {
        e.printStackTrace();
    }finally {
        try {
            if(out!=null){
                out.close();
            }
            if(channel!=null){
                channel.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
//===================反序列化=============================
    FileInputStream fis = null;
    FileChannel readChannel = null;
    try {
        fis = new FileInputStream(file);
        ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
        readChannel = fis.getChannel();
        int readBytes = 0;
        while ((readBytes=readChannel.read(byteBuffer))!=-1){
            System.out.println("读取数据个数:"+readBytes);
        }
        //把指针回到最初的状态,准备从byteBuffer当中读取数据
        byteBuffer.flip();
        //解析出二进制为Items对象。
        Items items = Items.getRootAsItems(byteBuffer);
        //读取数据测试看看是否跟保存的一致
        Log.i(TAG,"items.id:"+items.ItemId());
        Log.i(TAG,"items.timestemp:"+items.timestemp());

        Basic basic2 = items.basic(0);
        Log.i(TAG,"basic2.name:"+basic2.name());
        Log.i(TAG,"basic2.email:"+basic2.email());

        //carList
        int length = basic2.carListLength();
        for (int i=0;i<length; i++){
            Car car = basic2.carList(i);
            Log.i(TAG,"car.number:"+car.number());
            Log.i(TAG,"car.describle:"+car.describle());
        }
    } catch (Exception e) {
        e.printStackTrace();
    }finally {
        try {
            if(readChannel!=null){
                readChannel.close();
            }
            if(fis!=null){
                fis.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3.基本原理

原理图

FlatBuffers 保存在一个 byte 数组中,有一个“支点”指针(pivot point)以此为界,存储的内容分为两个部分:元数据和数据内容。其中元数据部分就是数据在前面,其长度等于对象中的字段数量,每个 byte 保存对应字段内容在数组中的索引(从支点位置开始计算)。

namespace com.race604.fbs;
enum FriendshipStatus: int {Friend = 1, NotFriend}
table Person {
name: string;
friendshipStatus: FriendshipStatus = Friend;
spouse: Person;
friends: [Person];
}
root_type Person;

上面的 Person 对象第一个字段是 name,其值的索引位置是 1,所以从索引位置 1 开始的字符串,就是 name 字段的值 "John"。第二个字段是 friendshipStatus,其索引值是 6,找到值为 2, 表示 NotFriend。第三个字段是 spouse,也一个 Person 对象,索引值是 12,指向的是此对象的支点位置。第四个字段是一个数组,图中表示的数组为空,所以索引值是 0。

相关文章

  • 网络传输优化----flatBuffer

    1.优点 2.使用方法 下载文件编译工具1.下载源码$ git clone https://github.com/...

  • FlatBuffer优化数据传输性能

    [FlatBuffer系列介绍]https://www.jianshu.com/p/a110390a65faFla...

  • FlatBuffer优化数据传输效率

    引言 数据序列化 数据序列化的行为可能发生在数据传递过程中的任何阶段,例如网络传输,不同进程间数据传递,不同类之间...

  • 在Android中使用Protocol Buffers

    网络性能优化的终极手法就是不通过网络传输,但这常常是不可能的。但我们还是可以通过对网络传输的数据本身做优化,来获得...

  • 面试问到的问题

    性能优化: 一、网络传输阶段 1、减少传输过程中实体的大小 1)缓存 2)cookie优化 3)文件压...

  • flatBuffer

    flatBuffer原理 flatBuffer 与json对比

  • Kafka设计之美

    一 数据传输 1 传统数据从文件到网络的传输路径 2 传统数据从文件到网络的传输路径图解 3 对传统数据传输的优化...

  • Flink 网络传输优化技术

    作为工业级的流计算框架,Flink 被设计为可以每天处理 TB 甚至 PB 级别的数据,所以如何高吞吐低延迟并且可...

  • 网络传输优化的思路

    网络传输的优化主要有以下两个思路: 更少的流量压缩数据差量化传输选择合适的序列化方式 更低的网络延时可靠UDP多线...

  • 从应用层协议协商机制看,是否应该选择支持 HTTP/2 的 CD

    随着网络传输数据量的剧增,网络数据的传输优化已经变得刻不容缓。而 CDN 支持 HTTP/2 可以在很大程度缓解数...

网友评论

    本文标题:网络传输优化----flatBuffer

    本文链接:https://www.haomeiwen.com/subject/itvmhxtx.html