`
GodJohnny
  • 浏览: 94064 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

FlatBuffer在JAVA下的使用

 
阅读更多
   早听说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

    然后,使用FlatBuffer编译器(flatc)将Schema文件转换为C++、Java、C#等语言的接口,这些接口允许你创建、读取和修改FlatBuffer数据。 FlatBuffer支持向后兼容性,这意味着即使Schema有所更改,旧版本的代码仍然...

    flatbuffers

    5. **Java端反序列化**:在Java应用中,使用生成的Java类读取二进制数据,直接访问序列化时的原始结构。 6. **访问数据**:由于Flatbuffers的特性,反序列化后可以直接通过对象的字段访问数据,无需遍历结构。 **...

    Android FlatBuffer

    - **序列化**: 在Java代码中创建数据对象,然后使用FlatBufferBuilder来构建FlatBuffer。 - **反序列化**: 通过FlatBuffer的Java类,可以直接访问内存中的数据,无需额外的解析步骤。 ### 4. 并发和性能优化 由于...

    FlatBuff JavaTools demo

    在这个JavaTools项目中,开发者展示了如何使用FlatBuffer在Java环境下对文本文件进行序列化和反序列化操作。 序列化是将对象的状态转换为可存储或可传输的形式的过程,而反序列化则是相反的过程,将数据恢复为原来...

    flatbuffer-gradle-plugin:gradle插件包装器可从flatbuffer模式生成Java类

    FlatBuffer Java类在每次构建时都会生成。 注意:我们选择不对此插件使用增量构建,因为由于架构文件中的名称空间声明,输出目录的确切位置未知。 设置 克隆FlatBuffer。 打开Xcode项目: 。 另外,您可以生成你...

    flatbuffers-java-1.12.0-API文档-中文版.zip

    赠送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高效的跨平台序列化库

    在这个讨论中,我们将深入理解FlatBuffers的工作原理、它的优势、如何在Java开发中使用它,以及如何与提供的`google-flatbuffers-53cd5a7`压缩包文件进行交互。 1. **FlatBuffers的工作原理** - FlatBuffers是一种...

    FlatBuffer Android示例应用程序

    在这个“FlatBuffer Android示例应用程序”中,作者amitshekhariitbhu展示了如何在Android平台上使用FlatBuffers来替代传统的JSON解析,以提升性能。 1. **FlatBuffers基础概念**: - FlatBuffers是一种结构化数据...

    async-flatbuffer-demo:使用FlatBuffers和gRPC演示异步客户端-服务器应用程序

    通过这个演示项目,开发者可以深入理解如何在Java环境中结合使用FlatBuffers和gRPC实现高效、异步的客户端-服务器通信。这种组合尤其适用于对性能有高要求的实时系统,如游戏服务器、物联网应用或者大规模数据处理...

    flatbuffers-java-poc:FlattBuffers 的替代 Java 实现的概念证明

    向量表指针在设置时被初始化。 如有必要,可以使用 initXXX() 方法将它们初始化为 NULL 除了可重用对象和字符串转换之外,没有任何动态内存分配。 此 Api 的主要目标是确定性和易用性 使用对象 api 时,原始地址...

    FlatBufferExample:比较Flatbuffer与JSON的简短示例

    在Java中,你可以使用FlatBuffers的Java API来创建和解析Flatbuffer数据。API允许你构建和读取Flatbuffer数据结构,这些数据结构可以被序列化成字节流,然后在网络间传输或者保存到磁盘。 这个名为...

    flatbuffers.zip

    总的来说,“flatbuffers.zip”提供了在Windows环境下使用FlatBuffers所需的一切,包括编译器和库文件。无论是想在现有项目中集成FlatBuffers,还是学习如何使用它,这个压缩包都是一个很好的起点。开发者可以根据...

    grpc-flatbuffers:使用flatbuffers的独立GRPC程序

    **grpc-flatbuffers:使用flatbuffers的独立GRPC程序** 在现代软件开发中,高效的数据交换是关键,特别是在分布式系统...不过,需要根据项目需求权衡是否采用这种技术组合,尤其是在考虑到兼容性和学习成本的情况下。

    FlatBuffers

    不同于JSON或XML这样的文本格式,FlatBuffers使用二进制布局,使得在内存中直接访问序列化数据变得非常快速,无需解析过程。 ### 2. `FlatBufferBuilder.java` `FlatBufferBuilder`是Java中用于构建FlatBuffers的...

    objectbox-java:ObjectBox是用于对象的超快速轻量级数据库

    使用ObjectBox的演示代码: Playlist playlist = new Playlist ( " My Favorites " ); playlist . songs . add( new Song ( " Lalala " )); playlist . songs . add( new Song ( " Lololo " )); box . put...

    flatbuffers-master.zip

    3. 动态数据访问:即使在不知道数据结构的情况下,也可以通过索引访问FlatBuffer中的数据,这得益于其“表”和“矢量”的概念。 三、FlatBuffers的使用 1. 定义Schema:首先,你需要定义数据的schema,这是一个...

    Excel2Flatbuffers.zip

    在使用此工具前,开发者需要对Flatbuffers有一定的了解,包括其基本概念、schema的编写以及如何在目标语言(如C++、Java、Python等)中使用Flatbuffers API来读取数据。对于Excel的处理,可能需要使用Python的pandas...

    swift-FlatBuffersSwiftSwift高效跨平台序列化库

    3. **序列化**:在Swift应用中,你可以使用生成的API创建和填充FlatBuffer对象。这些对象会按照Schema定义的结构进行编码,生成二进制数据。 4. **反序列化**:当你需要从存储或网络获取的二进制数据中恢复对象时,...

    springboot-flatbuffers:这项研究产品将借助Google的FlatBuffersSwift启动

    springboot-flatbuffers 带有 HTTP服务器演示的Google 用Java编译FlatBuffers方案 /usr/local/bin/flatc -j -o src/main/java src/main/idl/fbs/v1.0.fbs FlatBuffersHttpMessageConverter

    内存高效序列化库谷歌/ FlatBuffers

    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 ...

Global site tag (gtag.js) - Google Analytics