# Quick Start

This will quickly go over the parts of using FlatBuffers to serialize some data.
See the [Tutorial](tutorial.md) for a more in depth guide.

1. **Build the compiler for FlatBuffers ([`flatc`](flatc.md))**

    ```sh
    cmake -G "Unix Makefiles"
    make -j
    ```

2. **Define your FlatBuffer [schema](schema.md) (`.fbs`)**

    ```c title="monster.fbs" linenums="1"
    table Monster {
      name:string;
      health:int;
    }

    root_type Monster;
    ```

    See [monster.fbs](https://github.com/google/flatbuffers/blob/master/samples/monster.fbs)
    for an complete example.

3. **Generate code for your language(s)**

    Use the `flatc` compiler to take your schema and generate language-specific
    code:

    ```sh
    ./flatc --cpp --rust monster.fbs
    ```

    Which generates `monster_generated.h` and `monster_generated.rs` files.

4. **Serialize data**

    Use the generated code files, as well as the `FlatBufferBuilder` to construct
    your serialized buffer.

    ```c++ title="my_monster_factory.cc" linenums="1"
    #include "flatbuffers.h"
    #include "monster_generated.h"

    int main() {
      // Used to build the flatbuffer
      FlatBufferBuilder builder;

      // Auto-generated function emitted from `flatc` and the input
      // `monster.fbs` schema.
      auto monster = CreateMonsterDirect(builder, "Abominable Snowman", 100);

      // Finalize the buffer.
      builder.Finish(monster);
    }
    ```

    See complete [C++ Example](https://github.com/google/flatbuffers/blob/master/samples/sample_binary.cpp#L24-L56).

5.  **Transmit/Store the serialized FlatBuffer**

    Use your serialized buffer however you want. Send it to someone, save it for
    later, etc...

    ```c++ title="my_monster_factory.cc" linenums="13"
    // Get a pointer to the flatbuffer.
    const uint8_t* flatbuffer = builder.GetBufferPointer();
    ```

6.  **Read the data**

    Use the generated accessors to read the data from the serialized buffer.

    It doesn't need to be the same language, or even schema version (see
    [Evolving](evolution.md)), FlatBuffers ensures the data is readable across
    languages and schema versions.

    ```c++ title="my_monster_factory.cc" linenums="15"
    // Get a view of the root monster from the flatbuffer.
    const Monster snowman = GetMonster(flatbuffer);

    // Access the monster's fields directly.
    ASSERT_EQ(snowman->name(), "Abominable Snowman");
    ASSERT_EQ(snowman->health(), 100);
    ```

    See [`Rust` examples](https://github.com/google/flatbuffers/blob/master/samples/sample_binary.rs#L92-L106)
    for reading the data written by `C++`.
