- Flat Buffers - Home
- Flat Buffers - Introduction
- Flat Buffers - Environment Setup
- Flat Buffers - Schema
- Flat Buffers - Constructs
- Flat Buffers - table
- Flat Buffers - string
- Flat Buffers - Numbers
- Flat Buffers - Boolean
- Flat Buffers - Enum
- Flat Buffers - Vector
- Flat Buffers - Struct
- Flat Buffers - Union
- Flat Buffers - Nested Table
- Flat Buffers - Default Values
- Flat Buffers - JSON to Binary
- Flat Buffers - Binary to JSON
- Flat Buffers - Mutatable Buffers
- Flat Buffers - Backward Compatability
- Flat Buffers - Language Independence
- Flat Buffers Useful Resources
- Flat Buffers - Quick Guide
- Flat Buffers - Useful Resources
- Flat Buffers - Discussion
Flat Buffers - Vector
Overview
The Vector data type is one of the composite datatypes of Flat Buffers. It is equivalent to an array or List in the languages that we use, for example, Java etc.
Continuing with our theater example from Flat Buffers - String chapter, following is the syntax that we need to have to instruct FlatBuffers that we will be creating a vector −
theater.fbs
namespace com.tutorialspoint.theater;
table Theater {
snacks:[string]; // vector of strings
tickets:[float]; // vector of floats
}
root_type Theater;
Now our table contains vector attributes of string and float.
Creating Java Classes from fbs File
To use FlatBuffers, we will now have to use flatc binary to create the required classes from this ".fbs" file. Let us see how to do that −
flatc --java theater.fbs
This will create a Theater.java class in com > tutorialspoint > theater folder in current directory. We're using this class in our application similar to as done in Flat Buffers - Schema chapter.
Using Java Classes created from fbs File
Creating and Writing Vector
In order to create a Vector, we need to first prepare the offset of scalar type array and then we can add the vector to the flat buffer.
// create data for an array of strings
int popcorn = builder.createString("Popcorn");
int coke = builder.createString("Coke");
int chips = builder.createString("Chips");
int soda = builder.createString("Soda");
// create array for snacks
int[] snacks = {popcorn, coke, chips, soda};
// create offset for snacks vector
int snacksVector = Theater.createSnacksVector(builder, snacks);
// add details to the Theater FlatBuffer
Theater.addSnacks(builder, snacksVector);
Following example code is showing the process of creating a Vector of String and ints.
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);
// create data for an array of strings
int popcorn = builder.createString("Popcorn");
int coke = builder.createString("Coke");
int chips = builder.createString("Chips");
int soda = builder.createString("Soda");
// create array for snacks
int[] snacks = {popcorn, coke, chips, soda};
// create array for tickets
float[] tickets = {100.0f, 100.f, 200.f};
// create offset for snacks vector
int snacksVector = Theater.createSnacksVector(builder, snacks);
// create offset for tickets vector
int ticketsVector = Theater.createTicketsVector(builder, tickets);
// create theater FlatBuffers using startTheater() method
Theater.startTheater(builder);
// add details to the Theater FlatBuffer
Theater.addSnacks(builder, snacksVector);
Theater.addTickets(builder, ticketsVector);
// 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);
}
}
Reading Vector
In order to read a Vector, we have methods to get the length of vector and to get an entry by an index as shown below.
// iterate snacks vector of length determined by snacksLength() method
for(int i = 0; i < theater.snacksLength(); i++ ) {
// get a snack by its index
System.out.print(" " + theater.snacks(i));
}
Following example code is showing the process of reading a Vector of String and ints.
TheaterReader.java
package com.tutorialspoint.theater;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.ByteBuffer;
public class TheaterReader {
public static void main(String[] args) throws FileNotFoundException, IOException {
String filename = "theater_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
Theater theater = Theater.getRootAsTheater(buf);
// print theater values
System.out.println("Snacks: ");
for(int i = 0; i < theater.snacksLength(); i++ ) {
System.out.print(" " + theater.snacks(i));
}
System.out.println("\nTickets: ");
for(int i = 0; i < theater.ticketsLength(); i++ ) {
System.out.print(" " + theater.tickets(i));
}
}
}
}
Compile the project
Now that we have set up the reader and the writer, let us compile the project.
mvn clean install
Serialize the Java Object
Now, post compilation, let us execute the writer first −
> java -cp .\target\flatbuffers-tutorial-1.0.jar com.tutorialspoint.theater.TheaterWriter Saving theater information to file: theater_flatbuffers_output Saved theater information with following data to disk: 96
Deserialize the Serialized Object
Now, let us execute the reader to read from the same file −
java -cp .\target\flatbuffers-tutorial-1.0.jar com.tutorialspoint.theater.TheaterReader Reading from file theater_flatbuffers_output Snacks: Popcorn Coke Chips Soda Tickets: 100.0 100.0 200.0
So, as we see, we are able to read the serialized vector by deserializing the binary data to Theater object. In the next chapter Flat Buffers - struct, we will look at the sector, a composite type.