blob: 76b494c8a1e665b2e6b9854af4615fbd3fd5eab5 [file] [log] [blame] [view]
# Fory C++ Hello World (Serialization)
This example demonstrates how to use Fory's high-performance serialization for C++ objects.
## Prerequisites
- CMake 3.16 or higher (for CMake build)
- Bazel 8+ (for Bazel build)
- C++17 compatible compiler (GCC 7+, Clang 5+, MSVC 2017+)
## Building with CMake
### Option 1: Using FetchContent (Recommended)
The easiest way to use Fory is with CMake's `FetchContent` module:
```cmake
include(FetchContent)
FetchContent_Declare(
fory
GIT_REPOSITORY https://github.com/apache/fory.git
GIT_TAG main
SOURCE_SUBDIR cpp
)
FetchContent_MakeAvailable(fory)
target_link_libraries(your_app PRIVATE fory::serialization)
```
### Build and Run
```bash
cd examples/cpp/hello_world
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
cmake --build . --parallel
./hello_world
```
Or use the provided script:
```bash
./run.sh
```
## Building with Bazel
### In-repo build (for testing within Fory repository)
From the repository root:
```bash
bazel build //examples/cpp/hello_world:hello_world
bazel run //examples/cpp/hello_world:hello_world
```
Or use the provided script:
```bash
./run_bazel.sh
```
### Standalone project (using Fory as external dependency)
For your own project using Fory as a dependency:
1. Copy `MODULE.bazel.example` to `MODULE.bazel` in your project root
2. Copy `BUILD.standalone` to `BUILD` in your source directory
3. Adjust the git commit or use `local_path_override` for local development
```bazel
# In your MODULE.bazel
bazel_dep(name = "fory", version = "0.14.1")
git_override(
module_name = "fory",
remote = "https://github.com/apache/fory.git",
commit = "main", # Use specific commit for reproducibility
)
# In your BUILD file
cc_binary(
name = "my_app",
srcs = ["main.cc"],
deps = ["@fory//cpp/fory/serialization:fory_serialization"],
)
```
## Example Overview
This example demonstrates:
- **Primitive types**: Serializing integers, floats, and basic types
- **Strings**: High-performance string serialization
- **Collections**: Vectors and maps
- **Custom structs**: Using `FORY_STRUCT` macro to register struct fields
- **Nested structs**: Structs containing other structs
- **Enums**: Enum serialization
## Key Concepts
### Registering Structs
Use the `FORY_STRUCT` macro to register struct fields for serialization:
```cpp
struct Point {
int32_t x;
int32_t y;
};
FORY_STRUCT(Point, x, y);
```
### Creating a Fory Instance
```cpp
auto fory = fory::serialization::Fory::builder()
.xlang(true) // Enable cross-language serialization
.track_ref(false) // Disable reference tracking
.build();
// Register struct types with unique IDs
fory.register_struct<Point>(1);
```
### Serialization and Deserialization
```cpp
// Serialize
Point point{10, 20};
auto bytes_result = fory.serialize(point);
if (bytes_result.ok()) {
auto bytes = bytes_result.value();
// Use bytes...
}
// Deserialize
auto result = fory.deserialize<Point>(bytes.data(), bytes.size());
if (result.ok()) {
Point deserialized = result.value();
}
```
## Using Fory in Your Project
### CMake Integration
```cmake
# Link to serialization library
target_link_libraries(your_app PRIVATE fory::serialization)
```
### Including Headers
```cpp
#include "fory/serialization/fory.h"
```