# Schema

The syntax of the schema language (aka IDL,
[Interface Definition Language](https://en.wikipedia.org/wiki/Interface_description_language))
should look quite familiar to users of any of the C family of languages, and
also to users of other IDLs. Let's look at an example first:

```c title="monster.fbs" linenums="1"
// example IDL file

namespace MyGame;

attribute "priority";

enum Color : byte { Red = 1, Green, Blue }

union Any { Monster, Weapon, Pickup }

struct Vec3 {
  x:float;
  y:float;
  z:float;
}

table Monster {
  pos:Vec3;
  mana:short = 150;
  hp:short = 100;
  name:string;
  friendly:bool = false (deprecated, priority: 1);
  inventory:[ubyte];
  color:Color = Blue;
  test:Any;
}

table Weapon {}
table Pickup {}

root_type Monster;
```

## Tables

Tables are the main way of defining objects in FlatBuffers.

```c title="monster.fbs - Example Table" linenums="17"
table Monster {
  pos:Vec3;
  mana:short = 150;
  hp:short = 100;
  name:string;
  friendly:bool = false (deprecated, priority: 1);
  inventory:[ubyte];
  color:Color = Blue;
  test:Any;
}
```

They consist of a name (here `Monster`) and a list of [fields](#fields). This
field list can be appended to (and deprecated from) while still maintaining
compatibility.

### Fields

Table fields have a name identifier, a [type](#types), optional default value,
optional [attributes](#attributes) and ends with a `;`. See the
[grammar](grammar.md) for full details.

```ebnf
field_decl = ident `:` type [ `=` scalar ] metadata `;`
```

Fields do not have to appear in the wire representation, and you can choose to
omit fields when constructing an object. You have the flexibility to add fields
without fear of bloating your data. This design is also FlatBuffer's mechanism
for forward and backwards compatibility.

There are three, mutually exclusive, reactions to the non-presence of a table's
field in the binary data.

#### 1. Default

Default value fields with return the default value as defined in the schema. If
the default value is not specified in the schema, it will be `0` for scalar
types, or `null` for other types.

```c++
mana:short = 150;
hp:short;
inventory:[ubyte];
```

Here `mana` would default to the value `150`, `hp` to value `0`, and `inventory`
to `null`, if those fields are not set.

Only scalar values can have explicit defaults, non-scalar fields (strings,
vectors, tables) are `null` when not present.

This is the normal mode that fields will take.

??? danger "Don't change Default values"

    You generally do not want to change default values after they're initially
    defined. Fields that have the default value are not actually stored in the
    serialized data (see also Gotchas below). Values explicitly written by code
    generated by the old schema old version, if they happen to be the default, will
    be read as a different value by code generated with the new schema. This is
    slightly less bad when converting an optional scalar into a default valued
    scalar since non-presence would not be overloaded with a previous default value.
    There are situations, however, where this may be desirable, especially if you
    can ensure a simultaneous rebuild of all code.

#### 2. Optional

Optional value fields will return some form of `null` in the language generated.

=== "C++"

    ```c++
    std::optional<T> field;
    ```

For optional scalars, just set the field default value to `null`. If the
producer of the buffer does not explicitly set that field, it will be marked
`null`.

```c++
  hp:short = null;
```

!!! note

    Not every languages support scalar defaults yet

#### 3. Required

Required valued fields will cause an error if they are not set. The FlatBuffers
verifier would consider the whole buffer invalid.

This is enabled by the [`required` attribute](#required) on the field.

```
  hp:short (required)
```

You cannot have `required` set with an explicit default value, it will result in
a compiler error.

## Structs

Similar to a table, `structs` consist of fields are required (so no defaults
either), and fields may not be added or be deprecated.

```c title="monster.fbs - Example Struct" linenums="11"
struct Vec3 {
  x:float;
  y:float;
  z:float;
}
```

Structs may only contain scalars or other structs. Use this for simple objects
where you are very sure no changes will ever be made (as quite clear in the
example `Vec3`). Structs use less memory than tables and are even faster to
access (they are always stored in-line in their parent object, and use no
virtual table).

### Arrays

Arrays are a convenience short-hand for a fixed-length collection of elements.
Arrays allow the following syntax, while maintaining binary equivalency.

<div class="grid cards" markdown>

- **Normal Syntax**

  ===

  ```c++
  struct Vec3 {
    x:float;
    y:float;
    z:float;
  }
  ```

- **Array Syntax**

  ===

  ```c++
  struct Vec3 {
    v:[float:3];
  }
  ```

</div>

Arrays are currently only supported in a `struct`.

## Types

The following are the built-in types that can be used in FlatBuffers.

### Scalars

The standard assortment of fixed sized scalars are available. There are no
variable sized integers (e.g., `varints`).

| Size   | Signed            | Unsigned            | Floating Point       |
| ------ | ----------------- | ------------------- | -------------------- |
| 8-bit  | `byte`, `bool`    | `ubyte` (`uint8`)   |                      |
| 16-bit | `short` (`int16`) | `ushort` (`uint16`) |
| 32-bit | `int` (`int32`)   | `uint` (`uint32`)   | `float` (`float32`)  |
| 64-bit | `long` (`int64`)  | `ulong` (`uint64`)  | `double` (`float64`) |

The type names in parentheses are alias names such that for example `uint8` can
be used in place of `ubyte`, and `int32` can be used in place of `int` without
affecting code generation.

### Non-scalars

#### Vectors

Vector of any other type (denoted with `[type]`).

```c++
inventory:[ubyte];
```

!!! note "Nesting vectors"

    Nesting vectors is not supported, instead you can wrap the inner vector with
    a table.

    ```
    table nest{
       a:[ubyte]
    }

    table monster {
     a:[nest]
    }
    ```

#### Strings

Strings (indicated by `string`) are zero-terminated strings, prefixed by their
length. Strings may only hold UTF-8 or 7-bit ASCII. For other text encodings or
general binary data use vectors (`[byte]` or `[ubyte]`) instead.

```c++
name:string;
```

## Enums

Define a sequence of named constants, each with a given value, or increasing by
one from the previous one. The default first value is `0`. As you can see in the
enum declaration, you specify the underlying integral type of the enum with `:`
(in this case `byte`), which then determines the type of any fields declared
with this enum type.

Only integer types are allowed, i.e. `byte`, `ubyte`, `short` `ushort`, `int`,
`uint`, `long` and `ulong`.

Typically, enum values should only ever be added, never removed (there is no
deprecation for enums). This requires code to handle forwards compatibility
itself, by handling unknown enum values.

## Unions

Unions share a lot of properties with enums, but instead of new names for
constants, you use names of tables. You can then declare a union field, which
can hold a reference to any of those types, and additionally a field with the
suffix `_type` is generated that holds the corresponding enum value, allowing
you to know which type to cast to at runtime.

It's possible to give an alias name to a type union. This way a type can even be
used to mean different things depending on the name used:

```txt
table PointPosition { x:uint; y:uint; }
table MarkerPosition {}
union Position {
  Start:MarkerPosition,
  Point:PointPosition,
  Finish:MarkerPosition
}
```

Unions contain a special `NONE` marker to denote that no value is stored so that
name cannot be used as an alias.

Unions are a good way to be able to send multiple message types as a FlatBuffer.
Note that because a union field is really two fields, it must always be part of
a table, it cannot be the root of a FlatBuffer by itself.

If you have a need to distinguish between different FlatBuffers in a more
open-ended way, for example for use as files, see the file identification
feature below.

There is an experimental support only in C++ for a vector of unions (and types).
In the example IDL file above, use [Any] to add a vector of Any to Monster
table. There is also experimental support for other types besides tables in
unions, in particular structs and strings. There's no direct support for scalars
in unions, but they can be wrapped in a struct at no space cost.

## Namespaces

These will generate the corresponding namespace in C++ for all helper code, and
packages in Java. You can use `.` to specify nested namespaces / packages.

## Includes

You can include other schemas files in your current one, e.g.:

```txt
include "mydefinitions.fbs";
```

This makes it easier to refer to types defined elsewhere. `include`
automatically ensures each file is parsed just once, even when referred to more
than once.

When using the `flatc` compiler to generate code for schema definitions, only
definitions in the current file will be generated, not those from the included
files (those you still generate separately).

## Root type

This declares what you consider to be the root table of the serialized data.
This is particularly important for parsing JSON data, which doesn't include
object type information.

## File identification and extension

Typically, a FlatBuffer binary buffer is not self-describing, i.e. it needs you
to know its schema to parse it correctly. But if you want to use a FlatBuffer as
a file format, it would be convenient to be able to have a "magic number" in
there, like most file formats have, to be able to do a sanity check to see if
you're reading the kind of file you're expecting.

Now, you can always prefix a FlatBuffer with your own file header, but
FlatBuffers has a built-in way to add an identifier to a FlatBuffer that takes
up minimal space, and keeps the buffer compatible with buffers that don't have
such an identifier.

You can specify in a schema, similar to `root_type`, that you intend for this
type of FlatBuffer to be used as a file format:

```txt
file_identifier "MYFI";
```

Identifiers must always be exactly 4 characters long. These 4 characters will
end up as bytes at offsets 4-7 (inclusive) in the buffer.

For any schema that has such an identifier, `flatc` will automatically add the
identifier to any binaries it generates (with `-b`), and generated calls like
`FinishMonsterBuffer` also add the identifier. If you have specified an
identifier and wish to generate a buffer without one, you can always still do so
by calling `FlatBufferBuilder::Finish` explicitly.

After loading a buffer, you can use a call like `MonsterBufferHasIdentifier` to
check if the identifier is present.

Note that this is best for open-ended uses such as files. If you simply wanted
to send one of a set of possible messages over a network for example, you'd be
better off with a union.

Additionally, by default `flatc` will output binary files as `.bin`. This
declaration in the schema will change that to whatever you want:

```txt
file_extension "ext";
```

## RPC interface declarations

You can declare RPC calls in a schema, that define a set of functions that take
a FlatBuffer as an argument (the request) and return a FlatBuffer as the
response (both of which must be table types):

```txt
rpc_service MonsterStorage {
    Store(Monster):StoreResponse;
    Retrieve(MonsterId):Monster;
}
```

What code this produces and how it is used depends on language and RPC system
used, there is preliminary support for GRPC through the `--grpc` code generator,
see `grpc/tests` for an example.

## Comments & documentation

May be written as in most C-based languages. Additionally, a triple comment
(`///`) on a line by itself signals that a comment is documentation for whatever
is declared on the line after it (table/struct/field/enum/union/element), and
the comment is output in the corresponding C++ code. Multiple such lines per
item are allowed.

## Attributes

Attributes may be attached to a declaration, behind a field/enum value, or after
the name of a table/struct/enum/union. These may either have a value or not.
Some attributes like `deprecated` are understood by the compiler; user defined
ones need to be declared with the attribute declaration (like `priority` in the
example above), and are available to query if you parse the schema at runtime.
This is useful if you write your own code generators/editors etc., and you wish
to add additional information specific to your tool (such as a help text).

Current understood attributes:

- `id: n` (on a table field): manually set the field identifier to `n`. If you
  use this attribute, you must use it on ALL fields of this table, and the
  numbers must be a contiguous range from 0 onwards. Additionally, since a union
  type effectively adds two fields, its id must be that of the second field (the
  first field is the type field and not explicitly declared in the schema). For
  example, if the last field before the union field had id 6, the union field
  should have id 8, and the unions type field will implicitly be 7. IDs allow
  the fields to be placed in any order in the schema. When a new field is added
  to the schema it must use the next available ID.
- `deprecated` (on a field): do not generate accessors for this field anymore,
  code should stop using this data. Old data may still contain this field, but
  it won't be accessible anymore by newer code. Note that if you deprecate a
  field that was previous required, old code may fail to validate new data (when
  using the optional verifier).

### `required`

- `required` (on a non-scalar table field): this field must always be set. By
  default, fields do not need to be present in the binary. This is desirable, as
  it helps with forwards/backwards compatibility, and flexibility of data
  structures. By specifying this attribute, you make non- presence in an error
  for both reader and writer. The reading code may access the field directly,
  without checking for null. If the constructing code does not initialize this
  field, they will get an assert, and also the verifier will fail on buffers
  that have missing required fields. Both adding and removing this attribute may
  be forwards/backwards incompatible as readers will be unable read old or new
  data, respectively, unless the data happens to always have the field set.
- `force_align: size` (on a struct): force the alignment of this struct to be
  something higher than what it is naturally aligned to. Causes these structs to
  be aligned to that amount inside a buffer, IF that buffer is allocated with
  that alignment (which is not necessarily the case for buffers accessed
  directly inside a `FlatBufferBuilder`). Note: currently not guaranteed to have
  an effect when used with `--object-api`, since that may allocate objects at
  alignments less than what you specify with `force_align`.
- `force_align: size` (on a vector): force the alignment of this vector to be
  something different than what the element size would normally dictate. Note:
  Now only work for generated C++ code.
- `bit_flags` (on an unsigned enum): the values of this field indicate bits,
  meaning that any unsigned value N specified in the schema will end up
  representing 1<<N, or if you don't specify values at all, you'll get the
  sequence 1, 2, 4, 8, ...
- `nested_flatbuffer: "table_name"` (on a field): this indicates that the field
  (which must be a vector of ubyte) contains flatbuffer data, for which the root
  type is given by `table_name`. The generated code will then produce a
  convenient accessor for the nested FlatBuffer.
- `flexbuffer` (on a field): this indicates that the field (which must be a
  vector of ubyte) contains flexbuffer data. The generated code will then
  produce a convenient accessor for the FlexBuffer root.
- `key` (on a field): this field is meant to be used as a key when sorting a
  vector of the type of table it sits in. Can be used for in-place binary
  search.
- `hash` (on a field). This is an (un)signed 32/64 bit integer field, whose
  value during JSON parsing is allowed to be a string, which will then be stored
  as its hash. The value of attribute is the hashing algorithm to use, one of
  `fnv1_32` `fnv1_64` `fnv1a_32` `fnv1a_64`.
- `original_order` (on a table): since elements in a table do not need to be
  stored in any particular order, they are often optimized for space by sorting
  them to size. This attribute stops that from happening. There should generally
  not be any reason to use this flag.
- 'native*\*'. Several attributes have been added to support the C++ object
  Based API. All such attributes are prefixed with the term "native*".

## JSON Parsing

The same parser that parses the schema declarations above is also able to parse
JSON objects that conform to this schema. So, unlike other JSON parsers, this
parser is strongly typed, and parses directly into a FlatBuffer (see the
compiler documentation on how to do this from the command line, or the C++
documentation on how to do this at runtime).

Besides needing a schema, there are a few other changes to how it parses JSON:

- It accepts field names with and without quotes, like many JSON parsers already
  do. It outputs them without quotes as well, though can be made to output them
  using the `strict_json` flag.
- If a field has an enum type, the parser will recognize symbolic enum values
  (with or without quotes) instead of numbers, e.g. `field: EnumVal`. If a field
  is of integral type, you can still use symbolic names, but values need to be
  prefixed with their type and need to be quoted, e.g. `field: "Enum.EnumVal"`.
  For enums representing flags, you may place multiple inside a string separated
  by spaces to OR them, e.g. `field: "EnumVal1 EnumVal2"` or
  `field: "Enum.EnumVal1 Enum.EnumVal2"`.
- Similarly, for unions, these need to specified with two fields much like you
  do when serializing from code. E.g. for a field `foo`, you must add a field
  `foo_type: FooOne` right before the `foo` field, where `FooOne` would be the
  table out of the union you want to use.
- A field that has the value `null` (e.g. `field: null`) is intended to have the
  default value for that field (thus has the same effect as if that field wasn't
  specified at all).
- It has some built in conversion functions, so you can write for example
  `rad(180)` where ever you'd normally write `3.14159`. Currently supports the
  following functions: `rad`, `deg`, `cos`, `sin`, `tan`, `acos`, `asin`,
  `atan`.

When parsing JSON, it recognizes the following escape codes in strings:

- `\n` - linefeed.
- `\t` - tab.
- `\r` - carriage return.
- `\b` - backspace.
- `\f` - form feed.
- `\"` - double quote.
- `\\` - backslash.
- `\/` - forward slash.
- `\uXXXX` - 16-bit unicode code point, converted to the equivalent UTF-8
  representation.
- `\xXX` - 8-bit binary hexadecimal number XX. This is the only one that is not
  in the JSON spec (see http://json.org/), but is needed to be able to encode
  arbitrary binary in strings to text and back without losing information (e.g.
  the byte 0xFF can't be represented in standard JSON).

It also generates these escape codes back again when generating JSON from a
binary representation.

When parsing numbers, the parser is more flexible than JSON. A format of numeric
literals is more close to the C/C++. According to the
[grammar](grammar.md), it accepts the following numerical literals:

- An integer literal can have any number of leading zero `0` digits. Unlike
  C/C++, the parser ignores a leading zero, not interpreting it as the beginning
  of the octal number. The numbers `[081, -00094]` are equal to `[81, -94]`
  decimal integers.
- The parser accepts unsigned and signed hexadecimal integer numbers. For
  example: `[0x123, +0x45, -0x67]` are equal to `[291, 69, -103]` decimals.
- The format of float-point numbers is fully compatible with C/C++ format. If a
  modern C++ compiler is used the parser accepts hexadecimal and special
  floating-point literals as well:
  `[-1.0, 2., .3e0, 3.e4, 0x21.34p-5, -inf, nan]`.

  The following conventions for floating-point numbers are used:

  - The exponent suffix of hexadecimal floating-point number is mandatory.
  - Parsed `NaN` converted to unsigned IEEE-754 `quiet-NaN` value.

  Extended floating-point support was tested with:

  - x64 Windows: `MSVC2015` and higher.
  - x64 Linux: `LLVM 6.0`, `GCC 4.9` and higher.

- For compatibility with a JSON lint tool all numeric literals of scalar fields
  can be wrapped to quoted string:
  `"1", "2.0", "0x48A", "0x0C.0Ep-1", "-inf", "true"`.

## Guidelines

### Efficiency

FlatBuffers is all about efficiency, but to realize that efficiency you require
an efficient schema. There are usually multiple choices on how to represent data
that have vastly different size characteristics.

It is very common nowadays to represent any kind of data as dictionaries (as in
e.g. JSON), because of its flexibility and extensibility. While it is possible
to emulate this in FlatBuffers (as a vector of tables with key and value(s)),
this is a bad match for a strongly typed system like FlatBuffers, leading to
relatively large binaries. FlatBuffer tables are more flexible than
classes/structs in most systems, since having a large number of fields only few
of which are actually used is still efficient. You should thus try to organize
your data as much as possible such that you can use tables where you might be
tempted to use a dictionary.

Similarly, strings as values should only be used when they are truly open-ended.
If you can, always use an enum instead.

FlatBuffers doesn't have inheritance, so the way to represent a set of related
data structures is a union. Unions do have a cost however, so an alternative to
a union is to have a single table that has all the fields of all the data
structures you are trying to represent, if they are relatively similar / share
many fields. Again, this is efficient because non-present fields are cheap.

FlatBuffers supports the full range of integer sizes, so try to pick the
smallest size needed, rather than defaulting to int/long.

Remember that you can share data (refer to the same string/table within a
buffer), so factoring out repeating data into its own data structure may be
worth it.

### Style guide

Identifiers in a schema are meant to translate to many different programming
languages, so using the style of your "main" language is generally a bad idea.

For this reason, below is a suggested style guide to adhere to, to keep schemas
consistent for interoperation regardless of the target language.

Where possible, the code generators for specific languages will generate
identifiers that adhere to the language style, based on the schema identifiers.

- Table, struct, enum and rpc names (types): UpperCamelCase.
- Table and struct field names: snake_case. This is translated to lowerCamelCase
  automatically for some languages, e.g. Java.
- Enum values: UpperCamelCase.
- namespaces: UpperCamelCase.

Formatting (this is less important, but still worth adhering to):

- Opening brace: on the same line as the start of the declaration.
- Spacing: Indent by 2 spaces. None around `:` for types, on both sides for `=`.

For an example, see the schema at the top of this file.

## Gotchas



### Testing whether a field is present in a table

Most serialization formats (e.g. JSON or Protocol Buffers) make it very explicit
in the format whether a field is present in an object or not, allowing you to
use this as "extra" information.

FlatBuffers will not write fields that are equal to their default value,
sometimes resulting in significant space savings. However, this also means we
cannot disambiguate the meaning of non-presence as "written default value" or
"not written at all". This only applies to scalar fields since only they support
default values. Unless otherwise specified, their default is 0.

If you care about the presence of scalars, most languages support "optional
scalars." You can set `null` as the default value in the schema. `null` is a
value that's outside of all types, so we will always write if `add_field` is
called. The generated field accessor should use the local language's canonical
optional type.

Some `FlatBufferBuilder` implementations have an option called `force_defaults`
that circumvents this "not writing defaults" behavior you can then use
`IsFieldPresent` to query presence. / Another option that works in all languages
is to wrap a scalar field in a struct. This way it will return null if it is not
present. This will be slightly less ergonomic but structs don't take up any more
space than the scalar they represent.

