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

因此,正如我們看到編寫器序列化並儲存到檔案的資料,該資料被讀取器正確地反序列化並相應地打印出來。

廣告

© . All rights reserved.