Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bevyengine
GitHub Repository: bevyengine/bevy
Path: blob/main/examples/reflection/serialization.rs
6849 views
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
8
use bevy::{
9
prelude::*,
10
reflect::serde::{ReflectDeserializer, ReflectSerializer},
11
};
12
use serde::de::DeserializeSeed;
13
14
fn 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)]
23
pub struct Player {
24
name: String,
25
health: u32,
26
}
27
28
const PLAYER_JSON: &str = r#"{
29
"serialization::Player": {
30
"name": "BevyPlayerOne",
31
"health": 50
32
}
33
}"#;
34
35
fn 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
51
fn 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
}
66
67