当前位置: 首页 > news >正文

Java中使用FlatBuffers实现序列化

Java 中的 FlatBuffers有助于高速数据序列化/反序列化,消除解析开销。它由 Google 开发,为跨平台数据交换提供无模式、内存高效的解决方案。 Java 开发人员可以利用其直接内存访问来实现最佳性能和最小内存占用,从而提高应用程序速度、可扩展性和互操作性。让我们深入了解 Java FlatBuffers 序列化。

什么是Java中的序列化和FlatBuffers?
在Java编程中,序列化是指将对象转换为字节流的过程。然后可以将该字节流存储在文件中、通过网络发送或保存在数据库中。序列化对于不同系统之间的数据持久性和通信至关重要。

Java 中的序列化
Java 通过 Serialized 接口提供了对序列化的内置支持。实现此接口的类可以使用 Java 的 ObjectOutputStream 和 ObjectInputStream 类进行序列化和反序列化。此外,Java 还提供了一个可外部化的接口,用于对序列化过程进行更细粒度的控制。

Java 中的 FlatBuffer
FlatBuffers是Google开发的一个高效的跨平台序列化库。与传统的序列化方法不同,FlatBuffers 不需要解析。相反,它们提供对序列化数据的直接访问,从而加快序列化和反序列化速度。在 Java 中,FlatBuffers 是通过代码生成器实现的,该代码生成器根据模式定义生成 Java 类。这些生成的类使开发人员能够轻松地序列化和反序列化数据,而无需手动解析或反射。这样可以以最小的开销实现高性能的数据处理。

使用 FlatBuffers 的好处

  • 高效的内存使用:与其他序列化格式相比,FlatBuffers 使用内存的效率更高。
  • 高速序列化和反序列化:直接访问序列化数据可以加快处理速度。
  • 支持架构演变:FlatBuffers 允许架构更改,而不会破坏向后兼容性。
  • 平台独立性:序列化数据可以在不同平台和编程语言之间共享。

代码演示:
依赖:

_ com.google.flatbuffers flatbuffers-java 24.3.25

FlatBuffers 结构schema文件 (.fbs)
在 FlatBuffers 中,数据结构是使用扩展名为.fbs.该文件指定数据结构的布局,包括其字段及其类型。让我们看一下定义人员对象的示例模式文件:

// Define schema in a .fbs file
table Person {
name: string;
age: int;
hobbies: [string];
}

在此schema中,我们定义一个名为“Person”的表,其中包含三个字段:字符串类型的“name”、int 类型的“age”和字符串数组的“hobbies”。该模式充当生成代码的蓝图,以便在序列化和反序列化过程中使用定义的数据结构。

使用 FlatBuffers
一旦定义了结构schema,我们就可以使用 FlatBuffers 代码生成器来生成与该结构schema相对应的 Java 类。

  • 这些生成的类提供了创建、访问和操作已定义数据结构实例的方法。

  • 该类Person将由 FlatBuffer 编译器 ( ) 根据提供的结构schema生成flatc,并将包含操作已定义数据结构所需的类和方法。

值得庆幸的是,所有这些都是由 IDE 自动完成的,因为我们已经在项目中包含了必要的依赖项。

// Java code to serialize and deserializepackage com.jcg.example;

import com.google.flatbuffers.FlatBufferBuilder;
import com.example.Person;

public class Main {
public static void main(String[] args) { // Create FlatBufferBuilder FlatBufferBuilder builder = new FlatBufferBuilder(); // Create hobbies strings int[] hobbies = {
builder.createString("Reading"),
builder.createString("Gaming")
}; // Serialize person object int personOffset = Person.createPerson(builder, builder.createString("John"), 30, Person.createHobbiesVector(builder, hobbies));
builder.finish(personOffset); // Deserialize person object byte[] buf = builder.sizedByteArray();
ByteBuffer bb = ByteBuffer.wrap(buf);
Person person = Person.getRootAsPerson(bb); // Access deserialized data System.out.println("Name: " + person.name());
System.out.println("Age: " + person.age());
for (int i = 0; i < person.hobbiesLength(); i++) {
System.out.println("Hobby " + (i+1) + ": " + person.hobbies(i));
}
}
}

在此代码中,我们使用 FlatBufferBuilder 创建一个 FlatBuffer 实例,表示一个名为““John”, age 30, 爱好hobby是 “Reading” 和“Gaming”的Person人员对象。然后,我们序列化该对象,将其反序列化回来,并访问反序列化的数据进行打印。

代码输出
代码输出显示了使用 FlatBuffers 在 Java 中对人对象进行序列化和反序列化后的反序列化数据。

Name: John
Age: 30
Hobby 1: Reading
Hobby 2: Gaming

使用 FlatBuffers 进行 JSON 转换
将 FlatBuffers 数据转换为 JSON 格式非常简单。 FlatBuffers 提供了直接将 FlatBuffers 对象序列化为 JSON 字符串的方法。这些方法根据模式定义自动生成数据的 JSON 表示形式,从而可以轻松地在 FlatBuffers 应用程序中使用 JSON 数据。

考虑一个简单的例子,我们有一个包含姓名、年龄和爱好等字段的人的模式。我们可以在文件中定义此模式.fbs并使用 FlatBuffers 代码生成工具生成 Java 类。然后,我们可以使用生成的代码将 JSON 数据解析为 FlatBuffers 对象,反之亦然。

import com.google.flatbuffers.FlatBufferBuilder;
import com.google.flatbuffers.FlexBuffers;

public class Main {
public static void main(String[] args) {
// Define schema for a person String schema = "table Person { name:string; age:int; hobbies:[string]; }"; // Create FlatBufferBuilder FlatBufferBuilder builder = new FlatBufferBuilder(); // Start building FlatBuffer int nameOffset = builder.createString("John");
int[] hobbiesOffsets = { builder.createString("Reading"), builder.createString("Gaming") };
int hobbiesVector = Person.createHobbiesVector(builder, hobbiesOffsets);
Person.startPerson(builder);
Person.addName(builder, nameOffset);
Person.addAge(builder, 30);
Person.addHobbies(builder, hobbiesVector);
int personOffset = Person.endPerson(builder);
Person.finishPersonBuffer(builder, personOffset); // Serialize FlatBuffer to JSON byte[] flatBufferBytes = builder.sizedByteArray();
FlexBuffers.TypedBuffer buffer = FlexBuffers.getRoot(new FlexBuffers.ByteBufferWrapper(flatBufferBytes));
String json = buffer.toJson(schema); // Print JSON representation System.out.println("JSON representation:");
System.out.println(json); // Deserialize JSON to FlatBuffer FlexBuffers.Builder flexBuilder = new FlexBuffers.Builder();
flexBuilder.fromJson(json, schema);
FlexBuffers.TypedBuffer typedBuffer = flexBuilder.finish();
byte[] flatBufferFromJson = typedBuffer.toByteArray(); // Access FlatBuffer data ByteBuffer byteBuffer = ByteBuffer.wrap(flatBufferFromJson);
Person person = Person.getRootAsPerson(byteBuffer);
System.out.println("\nDeserialized data:");
System.out.println("Name: " + person.name());
System.out.println("Age: " + person.age());
System.out.println("Hobbies:");
for (int i = 0; i < person.hobbiesLength(); i++) {
System.out.println("- " + person.hobbies(i));
}
}
}

在此示例中,我们为一个人定义一个schema结构,其中包含姓名、年龄和爱好等字段。然后,我们创建一个 FlatBuffer 来表示具有一些示例数据的人员对象。我们使用 FlexBuffers 将此 FlatBuffer 序列化为 JSON 格式。之后,我们将 JSON 反序列化回 FlatBuffer 并访问数据。

上述代码的输出将是:

JSON representation:
{
"name": "John", "age": 30, "hobbies": ["Reading", "Gaming"]
}

Deserialized data:
Name: John
Age: 30
Hobbies:
- Reading
- Gaming

结论
使用 FlatBuffers 就像拥有在计算机程序中存储和组织数据的超能力。首先描述数据在称为模式的特殊文件中的外观。然后,您使用工具根据该架构生成代码。此代码可帮助您轻松快速地管理数据,而不会牺牲速度。

FlatBuffers 很棒,因为它可以让您直接以紧凑的序列化形式访问数据,从而使其快速高效。另外,它很灵活——即使您稍后更改数据结构,FlatBuffers 也可以顺利处理。

FlatBuffers 的一个很酷的事情是它可以轻松地在自己的格式和 JSON 之间转换数据,JSON 是一种常见的数据表示方式。这意味着您可以使用 FlatBuffers 来处理 JSON 数据,而不会减慢程序速度。

总体而言,FlatBuffers 使程序中的数据处理变得简单。无论您是存储信息还是在不同系统之间共享信息,FlatBuffers 都能以其易于使用的工具和快速的性能满足您的需求。

https://www.jdon.com/73592.html ​​​​​​​

相关文章:

Java中使用FlatBuffers实现序列化

Java 中的 FlatBuffers有助于高速数据序列化/反序列化&#xff0c;消除解析开销。它由 Google 开发&#xff0c;为跨平台数据交换提供无模式、内存高效的解决方案。 Java 开发人员可以利用其直接内存访问来实现最佳性能和最小内存占用&#xff0c;从而提高应用程序速度、可扩展…...

[图解]SysML和EA建模住宅安全系统-02

1 00:00:00,900 --> 00:00:02,690 这个就是一个块定义图了 2 00:00:03,790 --> 00:00:04,780 简称BDD 3 00:00:05,610 --> 00:00:08,070 实际上就是UML里面的类图 4 00:00:08,080 --> 00:00:09,950 和组件图的一个结合体 5 00:00:13,150 --> 00:00:14,690 我…...

2024年北京服贸会媒体邀约资源有哪些?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 2024年北京服贸会&#xff08;中国国际服务贸易交易会&#xff0c;简称CIFTIS&#xff09;作为中国重要的国际性服务贸易盛会&#xff0c;会吸引众多媒体的关注和参与。媒体邀约资源通常…...

大语言模型LLM入门篇

大模型席卷全球&#xff0c;彷佛得模型者得天下。对于IT行业来说&#xff0c;以后可能没有各种软件了&#xff0c;只有各种各样的智体&#xff08;Agent&#xff09;调用各种各样的API。在这种大势下&#xff0c;笔者也阅读了很多大模型相关的资料&#xff0c;和很多新手一样&a…...

Alibaba Cloud Linux 安装mysql及注意事项

1.安装mysql #1.运行以下命令&#xff0c;更新YUM源。 sudo rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm#2.&#xff08;可选&#xff09;当操作系统为Alibaba Cloud Linux 3时&#xff0c;执行如下命令&#xff0c;安装MySQL所需的库文件…...

设计模式——工厂模式(Factory)

工厂模式&#xff08;Factory Pattern&#xff09;是一种常用的设计模式&#xff0c;它提供了一种封装创建对象过程的方法。通过工厂方法或工厂类&#xff0c;你可以将对象的创建与使用分离&#xff0c;使得代码更加灵活和可维护。工厂模式主要分为三种类型&#xff1a;简单工厂…...

NVIDIA Omniverse Cloud API支持数字孪生开发,可解决复杂AI问题 | 最新快讯

在全球范围内&#xff0c;价值超过 50 万亿美元的重工业市场&#xff0c;正在竞相实现数字化。 基于此&#xff0c;为帮助数字孪生技术更好地赋能千行百业&#xff0c;AI 企业 NVIDIA 在架构底层算力的同时&#xff0c;也搭建了 NVIDIA AI Enterprise 和 Omniverse 两大平台。 …...

智慧电力,山海鲸引领

随着科技的不断进步和电力行业的快速发展&#xff0c;智能化管理已成为电力行业的重要趋势。在这一背景下&#xff0c;山海鲸智慧电力管理系统凭借其卓越的性能和创新的功能&#xff0c;为电力行业带来了革命性的改变。 山海鲸智慧电力管理系统是一套集数据采集、分析、展示于…...

【文章转载】ChatGPT 提示词十级技巧: 从新手到专家

学习了微博网友宝玉xp老师《ChatGPT 提示词十级技巧: 从新手到专家》 个人学习要点&#xff1a; 1、关于提示中避免使用否定句&#xff0c;播主说&#xff1a;“没有人能准确解释为什么&#xff0c;但大语言模型在你告诉它去做某事时&#xff0c;表现似乎比你让它不做某事时更…...

类的生命周期

目录 一、概述 二、加载阶段 三、连接阶段 连接阶段之验证 连接阶段之准备 连接阶段之解析 四、初始化阶段 五、总结 一、概述 类的生命周期描述了一个类加载、使用、卸载的整个过程。 也是其他知识的基础&#xff1a; 类的生命周期&#xff1a; 二、加载阶段 加载(Loading…...

AI赋能分层模式,解构未来,智领风潮

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 &#x1f680; 转载自热榜文章&#x1f525;&#xff1a;探索设计模式的魅力&#xff1a;AI赋能分…...

Linux平台下muduo网络库源码编译安装与测试,包含boost库的安装与测试!!!!

最近在学习muduo网络库&#xff0c;先来记录一下如何在Linux平台下编译安装以及测试muduo网络库源码。 获取源码 muduo库源码github仓库地址&#xff1a; https://github.com/chenshuo/muduo 在linux系统下&#xff0c;输入 git clone https://github.com/chenshuo/muduo.git…...

MATLAB 函数

MATLAB 函数 函数是一起执行任务的一组语句。在MATLAB中&#xff0c;函数是在单独的文件中定义的。文件名和函数名应该相同。 函数在其自己的工作空间&#xff08;也称为本地工作空间&#xff09;中对变量进行操作&#xff0c;与在MATLAB命令提示符下访问的工作空间&#xff0…...

spring高级篇(七)

1、异常处理 在DispatcherServlet中&#xff0c;doDispatch(HttpServletRequest request, HttpServletResponse response) 方法用于进行任务处理&#xff1a; 在捕获到异常后没有立刻进行处理&#xff0c;而是先用一个局部变量dispatchException进行记录&#xff0c;然后统一由…...

根据token获取了username后,能否在其他地方使用这个获取的username,或者在其他地方如何获取username?

当然可以在其他地方使用获取到的用户名。一旦你从token中获取到用户名&#xff0c;你可以将其存储在能够在整个应用程序中访问的地方。 在你的代码中&#xff0c;你从token中获取用户名的地方是这里&#xff1a; String username getUsernameFromToken(token);在这行之后&am…...

值模板参数Value Template Parameters

模板通常使用类型作为参数&#xff0c;但它们也可以使用值。使用类型和可选名称声明一个值模板参数&#xff0c;方式与声明函数参数类似。值模板参数仅限于可以指定编译时常量的类型是bool、char、int等&#xff0c;但不允许使用浮点类型、字符串字面值和类。 #include <io…...

Splashtop 荣获 TrustRadius 颁发的“2024年度最受欢迎奖”

2024年5月8日 加利福尼亚州库比蒂诺 Splashtop 在全球远程访问和支持解决方案领域处于领先地位&#xff0c;该公司正式宣布将连续第三年荣获远程桌面和远程支持类别的“TrustRadius 最受欢迎奖”。Splashtop 的 trScore 评分高达8.6分&#xff08;满分10分&#xff09;&#x…...

使用python将`.mat`文件转换成`.xlsx`格式的Excel文件!!

要将.mat文件转换成.xlsx格式的Excel文件 第一步&#xff1a;导入必要的库第二步&#xff1a;定义函数来转换.mat文件第三步&#xff1a;调用函数注意事项 要将.mat文件转换成.xlsx格式的Excel文件&#xff0c;并保持文件名一致&#xff0c;你可以使用scipy.io.loadmat来读取.m…...

python基础 面向练习学习python1

python基础 面向练习学习python1 1. 电话查询问题描述1. 问题分析1. 输入输出分析2. 需求分析&#xff1a;将题目的数据存储并查询2. 所需知识&#xff1a; python 数据存储的类型3. 确定数据存储类型4. 如何书写代码拓展 从键盘中添加或删除联系人5. 回到数据查询 代码拓展 功…...

Ubuntu安装Docker和Docker Compose

文章目录 Docker安装Docker Compose安装示例前端Dockerfile示例 Docker官网&#xff1a; https://docs.docker.com/ Docker镜像仓库&#xff1a; https://hub.docker.com/ Docker安装 安装curl(可选) 如果已经安装了curl&#xff0c;则跳过此步骤 # 更新包缓存 sudo apt u…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代&#xff0c;海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构&#xff0c;在处理大规模数据抓取任务时展现出强大的能力。然而&#xff0c;随着业务规模的不断扩大和数据抓取需求的日益复杂&#xff0c;传统…...