- FlatBuffers 教程
- FlatBuffers - 首頁
- FlatBuffers - 簡介
- FlatBuffers - 模式
- FlatBuffers - 結構
- FlatBuffers - 表格
- FlatBuffers - 字串
- FlatBuffers - 數字
- FlatBuffers - 布林值
- FlatBuffers - 列舉
- FlatBuffers - 向量
- FlatBuffers - 結構體
- FlatBuffers - 聯合體
- FlatBuffers - 巢狀表格
- FlatBuffers - 預設值
- FlatBuffers - JSON 轉二進位制
- FlatBuffers - 二進位制轉 JSON
- FlatBuffers - 可變緩衝區
- FlatBuffers - 向後相容性
- FlatBuffers - 語言獨立性
- FlatBuffers 有用資源
- FlatBuffers - 快速指南
- FlatBuffers - 有用資源
- FlatBuffers - 討論
FlatBuffers - 模式
概述
現在讓我們使用 Google FlatBuffers 並看看它在一個簡單的問候應用程式中如何工作。在這個示例中,我們將建立一個簡單的應用程式,它將執行以下操作:
問候語編寫器
從使用者處獲取問候語和使用者名稱
將上述資訊儲存在磁碟上的檔案中
問候語讀取器
讀取我們在上面儲存的檔案中的同一個檔案
將資料轉換為物件並列印資料
FlatBuffers 模式檔案
FlatBuffers 的“模式檔案”包含我們要序列化的資料的模式定義。資料儲存在人類可讀的檔案中,副檔名為".fbs"。
讓我們將以下資料儲存在greeting.fbs中,我們將在第一個應用程式中使用它。
greeting.fbs
namespace com.tutorialspoint.greeting;
table Greet {
greeting: string;
username: string;
}
root_type Greet;
理解每個結構
namespace com.tutorialspoint.greeting;
這裡的namespace用於為從.fbs檔案生成的程式碼宣告包/名稱空間。例如,我們生成的 Java 類將位於 com.tutorialspoint.greeting 包中。
table Greet
將要建立/重新建立的物件的基本類的名稱。
greeting: string; username: string;
這些是Greet類的屬性以及資料型別。
root_type Greet;
root_type告訴 FlatBuffers 編譯器根表格是 Greet,並且在生成程式碼時將是主類。
FlatBuffers 程式碼生成
現在我們已經定義了,讓我們安裝“flatc”二進位制檔案,我們將使用它來自動生成上述Greet類的程式碼。二進位制檔案可以在"https://github.com/google/flatbuffers/releases"找到。
根據作業系統選擇正確的二進位制檔案。我們將在 Windows 上安裝 FlatBuffers 編譯器二進位制檔案,但 Linux 的步驟差別不大。
我們已下載https://github.com/google/flatbuffers/releases/download/v24.3.25/Windows.flatc.binary.zip
驗證 FlatBuffers 編譯器設定
安裝完成後,確保您可以透過命令列訪問它:
flatc --version flatc version 24.3.25
它確認 Flatc 已正確安裝。現在讓我們轉到為 Java 建立上面描述的問候應用程式。
Java 中的問候應用程式
現在我們已經安裝了flatc,我們可以使用flatc從 fa 檔案自動生成程式碼。讓我們首先建立一個 Java 專案。
以下是我們將用於 Java 專案的 Maven 配置。請注意,它還包含flatc-java所需的庫。
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tutorialspoint.greeting</groupId>
<artifactId>flatbuffers-tutorial</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/com.google.flatbuffers/flatbuffers-java -->
<dependency>
<groupId>com.google.flatbuffers</groupId>
<artifactId>flatbuffers-java</artifactId>
<version>24.3.25</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<configuration>
<!--Put your configurations here-->
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
我們所有的程式碼都將位於src/main/java下。
在專案結構完成之後,讓我們為Greet類生成程式碼:
生成 Java 類
flatc --java greeting.fbs
執行命令後,您將在當前目錄內的com > tutorialspoint > greeting資料夾下看到一個自動生成的類。
Greet.java
此檔案包含一個類Greet,它將幫助我們序列化和反序列化Greet物件。
使用生成的 Java 類
現在,讓我們編寫資料的編寫器,它將以使用者名稱和問候語作為輸入:
GreetWriter.java
package com.tutorialspoint.greeting;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import com.google.flatbuffers.FlatBufferBuilder;
public class GreetWriter {
public static void main(String[] args) throws FileNotFoundException, IOException {
// create a flat buffer builder
// it will be used to create Greet FlatBuffer
FlatBufferBuilder builder = new FlatBufferBuilder(1024);
// read greeting and username from console
int greeting = builder.createString(args[0]);
int username = builder.createString(args[1]);
// create Greet FlatBuffers using startGreet() method
Greet.startGreet(builder);
// add the greeting and username to the Greet FlatBuffer
Greet.addGreeting(builder, greeting);
Greet.addUsername(builder, username);
// mark end of data being entered in Greet FlatBuffer
int greet = Greet.endGreet(builder);
// finish the builder
builder.finish(greet);
// get the bytes to be stored
byte[] data = builder.sizedByteArray();
String filename = "greeting_flatbuffers_output";
System.out.println("Saving greeting to file: " + filename);
// write the builder content to the file named greeting_flatbuffers_output
try(FileOutputStream output = new FileOutputStream(filename)){
output.write(data);
}
System.out.println("Saved greeting with following data to disk: \n" + greeting);
}
}
編寫器簡單地獲取 CLI 引數,建立Greet物件,序列化它,然後將其轉儲到檔案中。
現在讓我們編寫一個讀取器,它將讀取檔案:
GreetReader.java
package com.tutorialspoint.greeting;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.ByteBuffer;
public class GreetReader {
public static void main(String[] args) throws FileNotFoundException, IOException {
String filename = "greeting_flatbuffers_output";
System.out.println("Reading from file " + filename);
try(FileInputStream input = new FileInputStream(filename)) {
// get the serialized data
byte[] data = input.readAllBytes();
ByteBuffer buf = ByteBuffer.wrap(data);
// read the root object in serialized data
Greet greet = Greet.getRootAsGreet(buf);
// print greet values
System.out.println("Greeting: " + greet.greeting() + "\n" + "Username: " + greet.username());
}
}
}
讀取器簡單地從同一個檔案讀取,反序列化它,並列印有關問候語的資料。
編譯專案
現在我們已經設定了讀取器和編寫器,讓我們編譯專案。
mvn clean install
序列化 Java 物件
現在,讓我們首先執行編寫器將物件序列化到檔案系統。
java -cp .\target\flatbuffers-tutorial-1.0.jar com.tutorialspoint.greeting.GreetWriter Hello John Saving greeting to file: greeting_protobuf_output Saved greeting with following data to disk: 12
反序列化已序列化的物件
然後,讓我們執行讀取器從檔案系統反序列化物件。
java -cp .\target\flatbuffers-tutorial-1.0.jar com.tutorialspoint.greeting.GreetReader Reading from file greeting_protobuf_output Greeting: Hello Username: John
因此,正如我們看到編寫器序列化並儲存到檔案的資料,該資料被讀取器正確地反序列化並相應地打印出來。