
- 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 - Default Values
Overview
We've seen in our previous examples, how to serialize and deserialize various types in flat buffers. In case, we do not specify any value then a default value is stored. If we've specify the same default value for the variable, then no extra space is allocated by flatbuffers.
Flat Buffers supports default values of its data types as per given table below −
Data Type | Default value |
---|---|
int16 / short / int / long | 0 |
Float/double | 0.0 |
String | Empty string |
Boolean | False |
Enum | First Enum item, that is the one with "index=0" |
Vector | Empty list |
Nested Class | null |
So, if one does not specify the data for these data types, then they would take the above default values. Now, let's continue with our theater example to demonstrate how it works.
In this example, we will let all the fields default. The only field which would be specified would be the name of the theater.
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 various data types −
theater.fbs
namespace com.tutorialspoint.theater; enum PAYMENT_SYSTEM: int { CASH = 0, CREDIT_CARD = 1, DEBIT_CARD, APP = 3 } table Theater { name:string; address:string; total_capacity:short; mobile:int; base_ticket_price:float; drive_in:bool; payment:PAYMENT_SYSTEM; snacks:[string]; owner: TheaterOwner; } table TheaterOwner { name:string; address:string; } root_type Theater;
Now our Theater table contains multiple attributes.
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, TheaterOwner and PAYMENT_SYSTEM classes 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
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 offset for name int name = builder.createString("Mery"); // create theater FlatBuffers using startTheater() method Theater.startTheater(builder); // add details to the Theater FlatBuffer Theater.addName(builder, name); // 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); } }
Next, we will have a reader to read the theater information −
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("Name: " + theater.name()); System.out.println("Address: " + theater.address()); System.out.println("Total Capacity: " + theater.totalCapacity()); System.out.println("Mobile: " + theater.mobile()); System.out.println("Base Ticket Price: " + theater.baseTicketPrice()); System.out.println("Drive In: " + theater.driveIn()); System.out.println("Snacks: "); if(theater.snacksLength() != 0) { for(int i = 0; i < theater.snacksLength(); i++ ) { System.out.print(" " + theater.snacks(i)); } }else { System.out.println("Snacks are empty."); } System.out.println("Payment Method: " + PAYMENT_SYSTEM.name(theater.payment())); System.out.println("Owner Details: "); TheaterOwner owner = theater.owner(); if(owner != null) { System.out.println("Name: " + owner.name()); System.out.println("Address: " + owner.address()); }else { System.out.println("Owner " + owner); } } } }
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 to file: theater_flatbuffers_output Saved theater with following data to disk: 20
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 Name: Mery Address: null Total Capacity: 0 Mobile: 0 Base Ticket Price: 0.0 Drive In: false Snacks: Snacks are empty. Payment Method: CASH Owner Details: Owner null
So, as we see, we are able to read the default values by deserializing the binary data to the Theater object.