早听说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());
}
}
分享到:
相关推荐
Flatbuffers 源码, 压缩包内target文件下包含了 jar供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; ...
向量表指针在设置时被初始化。 如有必要,可以使用 initXXX() 方法将它们初始化为 NULL 除了可重用对象和字符串转换之外,没有任何动态内存分配。 此 Api 的主要目标是确定性和易用性 使用对象 api 时,原始地址...
异步flatbuffer演示使用FlatBuffers和gRPC的演示异步客户端-服务器应用程序。
Flatbuffer示例 比较Flatterbuffer与JSON的示例
使用ObjectBox的演示代码: Playlist playlist = new Playlist ( " My Favorites " ); playlist . songs . add( new Song ( " Lalala " )); playlist . songs . add( new Song ( " Lololo " )); box . put...
高效的跨平台序列化库
grpc-flatbuffers:使用flatbuffers的独立GRPC程序
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 ...
FlatBuffers是一个开放源代码,跨平台的序列化库,旨在最大程度地提高内存... 它支持多种编程语言,包括C ++,C#,C,Go,Java,Kotlin,JavaScript,Lobster,Lua,TypeScript,PHP以及许多其他正在进行中的语言。
FlatBuffers FlatBuffers是一个高效的跨平台序列化库,适用于游戏和其他受内存限制的... 此跟踪是使用嵌入的版本字符串( flatbuffer_version_string )自动完成的,并有助于我们继续对其进行优化。 除了在应用程序二
概述 该存储库包含: ... “ KNIME Jython集成”包括三个Snippet节点,这些节点提供了在KNIME中使用Jython的功能。 细节 KNIME Python集成(主要版本2和3) 包含的项目 org.knime.features.python2 :包含