早听说FatBuffer的大名,据说比Protobuffer效率还要高。出于当初对Protobuf良好的印象,FlatBuffer同样是Google出品,因此在一个项目中尝试使用了FlatBuffer。
IDL之类的描述语言,轻车熟路地过了。可是实际使用时。真感觉用起来有很多反直觉的东西。
首先,一个对象的字符串属性时,必须先在创建这个对象前全部添加到FlatBufferBuilder中,然后再向对象中添加字符串的offset。同样当存在对象类型的属性时,也必须这么干。当是一个属性是对象数组时,就更麻烦了。
其次,最后生成字节数组时。竟然是用这种奇葩的方式来拷贝出来。
byte[] byteArray = new byte[fbb.offset()];
// buffer.get(byteArray, 0, fbb.offset());
System.arraycopy(buffer.array(), buffer.position(), byteArray, 0,
fbb.offset());
这段代码,还是在test的例子里找出来的。
上面两点,折腾很长时间,看文档,看例子才摸索出来的。
暂且把这段代码粘贴出来,找个备忘,也便于有需要的人吧。
IDL:
第一份:
table OfferMarket
{
contractType:string;
buyOrgID:string;
sellOrgID:string;
orderTypeForBuy:string;
orderNumForBuy:int = 0;
amountForBuy:double = 0;
amountCanBuy:double = 0;
priceForBuy:string ;
priceForSell:string;
amountCanSell:double = 0;
amountForSell:double = 0;
orderNumForSell:int = 0;
orderTypeForSell:string;
latestDealPrice:string;
latestDealAmount:double = 0;
updateTime:string;
referencePrice:string;
highestPrice:string;
lowestPrice:string;
errorCode:string;
errorMessage:string;
businessMDBookType:int;
TType:int=0;
}
root_type OfferMarket;
第二份:
include "OfferMarketModel.fbs";
///最新的市场行情列表
table LatestOfferMarketList
{
marketList : [OfferMarket];
}
root_type LatestOfferMarketList;
测试代码:
public static void main2(String[] args) {
FlatBufferBuilder fbb = new FlatBufferBuilder();
int[] buyOrtIdOffsets = new int[5];
for (int i = 0; i < 5; i++) {
buyOrtIdOffsets[i] = fbb.createString("buyOrgId" + i);
}
int[] marketsOffsets = new int[5];
for (int i = 0; i < 5; i++) {
System.out.println("i: " + i);
// fbb.createString("MMM");
OfferMarket.startOfferMarket(fbb);
OfferMarket.addAmountCanBuy(fbb, 100.1 + i);
OfferMarket.addBuyOrgID(fbb, buyOrtIdOffsets[i]);
int offset = OfferMarket.endOfferMarket(fbb);
// OfferMarket.finishOfferMarketBuffer(fbb, offset);
System.out.println("offset: " + offset);
marketsOffsets[i] = offset;
}
// 写法一
// fbb.startVector(4, 5, 4);
// for(int i=0;i<5;i++)
// {
// fbb.addOffset(marketsOffsets[i]);
// }
// int endOffset=fbb.endVector();
// 写法二
int endOffset = LatestOfferMarketList.createMarketListVector(fbb,
marketsOffsets);
// 写法一
// LatestOfferMarketList.startLatestOfferMarketList(fbb);
// LatestOfferMarketList.addMarketList(fbb, endOffset);
// int offsetList=LatestOfferMarketList.endLatestOfferMarketList(fbb);
// 写法二
int offsetList = LatestOfferMarketList.createLatestOfferMarketList(fbb,
endOffset);
LatestOfferMarketList
.finishLatestOfferMarketListBuffer(fbb, offsetList);
ByteBuffer buffer = fbb.dataBuffer();
System.out.println(buffer.position());
byte[] byteArray = new byte[fbb.offset()];
buffer.get(byteArray, 0, fbb.offset());
//System.arraycopy(buffer.array(), buffer.position(), byteArray, 0,
fbb.offset());
LatestOfferMarketList om2 = LatestOfferMarketList
.getRootAsLatestOfferMarketList(ByteBuffer.wrap(byteArray));// ByteBuffer.wrap(buffer.array()));
System.out.println("========== om2 len: " + om2.marketListLength());
for (int i = 0; i < om2.marketListLength(); i++) {
OfferMarket market = om2.marketList(i);
System.out.println(market.amountCanBuy());
System.out.println(market.buyOrgID());
}
}
分享到:
相关推荐
然后,使用FlatBuffer编译器(flatc)将Schema文件转换为C++、Java、C#等语言的接口,这些接口允许你创建、读取和修改FlatBuffer数据。 FlatBuffer支持向后兼容性,这意味着即使Schema有所更改,旧版本的代码仍然...
5. **Java端反序列化**:在Java应用中,使用生成的Java类读取二进制数据,直接访问序列化时的原始结构。 6. **访问数据**:由于Flatbuffers的特性,反序列化后可以直接通过对象的字段访问数据,无需遍历结构。 **...
- **序列化**: 在Java代码中创建数据对象,然后使用FlatBufferBuilder来构建FlatBuffer。 - **反序列化**: 通过FlatBuffer的Java类,可以直接访问内存中的数据,无需额外的解析步骤。 ### 4. 并发和性能优化 由于...
在这个JavaTools项目中,开发者展示了如何使用FlatBuffer在Java环境下对文本文件进行序列化和反序列化操作。 序列化是将对象的状态转换为可存储或可传输的形式的过程,而反序列化则是相反的过程,将数据恢复为原来...
FlatBuffer Java类在每次构建时都会生成。 注意:我们选择不对此插件使用增量构建,因为由于架构文件中的名称空间声明,输出目录的确切位置未知。 设置 克隆FlatBuffer。 打开Xcode项目: 。 另外,您可以生成你...
赠送jar包:flatbuffers-java-1.12.0.jar; 赠送原API文档:flatbuffers-java-1.12.0-javadoc.jar; 赠送源代码:flatbuffers-java-1.12.0-sources.jar; 赠送Maven依赖信息文件:flatbuffers-java-1.12.0.pom; ...
在这个讨论中,我们将深入理解FlatBuffers的工作原理、它的优势、如何在Java开发中使用它,以及如何与提供的`google-flatbuffers-53cd5a7`压缩包文件进行交互。 1. **FlatBuffers的工作原理** - FlatBuffers是一种...
在这个“FlatBuffer Android示例应用程序”中,作者amitshekhariitbhu展示了如何在Android平台上使用FlatBuffers来替代传统的JSON解析,以提升性能。 1. **FlatBuffers基础概念**: - FlatBuffers是一种结构化数据...
通过这个演示项目,开发者可以深入理解如何在Java环境中结合使用FlatBuffers和gRPC实现高效、异步的客户端-服务器通信。这种组合尤其适用于对性能有高要求的实时系统,如游戏服务器、物联网应用或者大规模数据处理...
向量表指针在设置时被初始化。 如有必要,可以使用 initXXX() 方法将它们初始化为 NULL 除了可重用对象和字符串转换之外,没有任何动态内存分配。 此 Api 的主要目标是确定性和易用性 使用对象 api 时,原始地址...
在Java中,你可以使用FlatBuffers的Java API来创建和解析Flatbuffer数据。API允许你构建和读取Flatbuffer数据结构,这些数据结构可以被序列化成字节流,然后在网络间传输或者保存到磁盘。 这个名为...
总的来说,“flatbuffers.zip”提供了在Windows环境下使用FlatBuffers所需的一切,包括编译器和库文件。无论是想在现有项目中集成FlatBuffers,还是学习如何使用它,这个压缩包都是一个很好的起点。开发者可以根据...
**grpc-flatbuffers:使用flatbuffers的独立GRPC程序** 在现代软件开发中,高效的数据交换是关键,特别是在分布式系统...不过,需要根据项目需求权衡是否采用这种技术组合,尤其是在考虑到兼容性和学习成本的情况下。
使用ObjectBox的演示代码: Playlist playlist = new Playlist ( " My Favorites " ); playlist . songs . add( new Song ( " Lalala " )); playlist . songs . add( new Song ( " Lololo " )); box . put...
不同于JSON或XML这样的文本格式,FlatBuffers使用二进制布局,使得在内存中直接访问序列化数据变得非常快速,无需解析过程。 ### 2. `FlatBufferBuilder.java` `FlatBufferBuilder`是Java中用于构建FlatBuffers的...
3. 动态数据访问:即使在不知道数据结构的情况下,也可以通过索引访问FlatBuffer中的数据,这得益于其“表”和“矢量”的概念。 三、FlatBuffers的使用 1. 定义Schema:首先,你需要定义数据的schema,这是一个...
在使用此工具前,开发者需要对Flatbuffers有一定的了解,包括其基本概念、schema的编写以及如何在目标语言(如C++、Java、Python等)中使用Flatbuffers API来读取数据。对于Excel的处理,可能需要使用Python的pandas...
3. **序列化**:在Swift应用中,你可以使用生成的API创建和填充FlatBuffer对象。这些对象会按照Schema定义的结构进行编码,生成二进制数据。 4. **反序列化**:当你需要从存储或网络获取的二进制数据中恢复对象时,...
springboot-flatbuffers 带有 HTTP服务器演示的Google 用Java编译FlatBuffers方案 /usr/local/bin/flatc -j -o src/main/java src/main/idl/fbs/v1.0.fbs FlatBuffersHttpMessageConverter
FlatBuffersFlatBuffers is a cross platform serialization library architected formaximum memory efficiency. It allows you to directly access serialized data without parsing/unpacking it first, while ...