FlatBuffers - 語言獨立性



概述

到目前為止,我們一直在使用 Java 來序列化和反序列化電影院資料。但是,Google FlatBuffers 提供的關鍵特性之一是“語言獨立性”。在本章中,我們將瞭解如何使用 Java 進行序列化,並使用 Python 進行反序列化。

繼續我們從Flat Buffers - 字串章節中的劇院示例,以下是我們在本示例中使用的模式:

theater.fbs

namespace com.tutorialspoint.theater;

table Theater {
   name:string;
   address:string;
}
root_type Theater;

使用 Java 進行序列化

要使用 FlatBuffers,我們現在必須使用flatc二進位制檔案從這個“.fbs”檔案建立所需的類。讓我們看看如何做到這一點:

flatc --java theater.fbs

這將在當前目錄中的com > tutorialspoint > theater資料夾中建立一個Theater.java類。我們在應用程式中使用此類,類似於Flat Buffers - 模式章節中所做的那樣。

使用從 fbs 檔案建立的 Java 類

首先,讓我們建立一個寫入器來寫入劇院資訊:

TheaterWriter.java

package com.tutorialspoint.theater;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import com.google.flatbuffers.FlatBufferBuilder;

public class TheaterWriter {
   public static void main(String[] args) throws FileNotFoundException, IOException {
      // create a flat buffer builder
      // it will be used to create Theater FlatBuffer
      FlatBufferBuilder builder = new FlatBufferBuilder(1024);

      int name = builder.createString("Silver Screener");
      int address = builder.createString("212, Maple Street, LA, California");

      // create theater FlatBuffers using startTheater() method
      Theater.startTheater(builder);
      // add the name and address to the Theater FlatBuffer
      Theater.addName(builder, name);
      Theater.addAddress(builder, address);

      // mark end of data being entered in Greet FlatBuffer
      int theater = Theater.endTheater(builder);

      // finish the builder
      builder.finish(theater);

      // get the bytes to be stored
      byte[] data = builder.sizedByteArray();

      String filename = "theater_flatbuffers_output";
      System.out.println("Saving theater to file: " + filename);
      // write the builder content to the file named theater_flatbuffers_output
      try(FileOutputStream output = new FileOutputStream(filename)){
         output.write(data);
      }
      System.out.println("Saved theater with following data to disk: \n" + theater);
   }
}	

編譯專案

現在我們已經設定了讀取器寫入器,讓我們編譯專案。

mvn clean install

序列化 Java 物件

現在,編譯後,讓我們先執行寫入器

java -cp .\target\flatbuffers-tutorial-1.0.jar com.tutorialspoint.theater.TheaterWriter

Saving theater to file: theater_flatbuffers_output
Saved theater with following data to disk:
72

使用 Python 反序列化序列化物件

從 proto 檔案生成 Python 類

讓我們為 Theater 類生成 Python 程式碼:

flatc  --python theater.fbs

執行此命令後,您會注意到在當前目錄中的com > tutorialspoint > theater資料夾中有一個自動生成的類Theater.py。此類將幫助我們反序列化劇院物件。

使用生成的 Python 類

現在,讓我們編寫資料的讀取器,它將使用 Java 讀取包含序列化物件的檔案:

theaterReader.py

import Theater

filename = "E:/theater_flatbuffers_output";
print("Reading from file: " + filename)

theater = Theater.Theater()

f = open(filename, "rb")
buf = f.read()
buf = bytearray(buf)
theater = theater.GetRootAs(buf);
f.close()

print("Name: " + theater.Name().decode("utf-8"))
print("Address: " + theater.Address().decode("utf-8"))

然後,讓我們執行讀取器

py theaterReader.py

Reading from file: E:/theater_flatbuffers_output
Name: Silver Screener
Address: 212, Maple Street, LA, California

因此,正如我們所看到的,Java 客戶端寫入的所有值都已正確反序列化並由我們的 Python 客戶端讀取,這有效地意味著 FlatBuffers 是語言獨立的。

廣告

© . All rights reserved.