serialization/
serialization.rs

1//! Illustrates how "reflection" serialization works in Bevy.
2//!
3//! Deriving `Reflect` will also register `SerializationData`,
4//! which powers reflect (de)serialization.
5//! Serializing reflected data *does not* require deriving serde's
6//! Serialize and Deserialize implementations.
7
8use bevy::{
9    prelude::*,
10    reflect::serde::{ReflectDeserializer, ReflectSerializer},
11};
12use serde::de::DeserializeSeed;
13
14fn main() {
15    App::new()
16        .add_plugins(DefaultPlugins)
17        .add_systems(Startup, (deserialize, serialize).chain())
18        .run();
19}
20
21/// Deriving `Reflect` includes reflecting `SerializationData`
22#[derive(Reflect)]
23pub struct Player {
24    name: String,
25    health: u32,
26}
27
28const PLAYER_JSON: &str = r#"{
29    "serialization::Player": {
30        "name": "BevyPlayerOne",
31        "health": 50
32    }
33}"#;
34
35fn deserialize(type_registry: Res<AppTypeRegistry>) {
36    let type_registry = type_registry.read();
37
38    // a serde_json::Value that might have come from an API
39    let value: serde_json::Value = serde_json::from_str(PLAYER_JSON).unwrap();
40
41    // alternatively, `TypedReflectDeserializer` can be used if the type
42    // is known.
43    let deserializer = ReflectDeserializer::new(&type_registry);
44    // deserialize
45    let reflect_value = deserializer.deserialize(value).unwrap();
46    // If Player implemented additional functionality, like Component,
47    // this reflect_value could be used with commands.insert_reflect
48    info!(?reflect_value);
49}
50
51fn serialize(type_registry: Res<AppTypeRegistry>) {
52    let type_registry = type_registry.read();
53
54    // a concrete value
55    let value = Player {
56        name: "BevyPlayerSerialize".to_string(),
57        health: 80,
58    };
59
60    // By default, all derived `Reflect` types can be serialized using serde. No need to derive
61    // Serialize!
62    let serializer = ReflectSerializer::new(&value, &type_registry);
63    let json = serde_json::to_string(&serializer).unwrap();
64    info!(?json);
65}