mirror of
https://github.com/bevyengine/bevy
synced 2024-12-30 06:53:13 +00:00
97f7a1a99c
# Objective Closes #5934 Currently it is not possible to de/serialize data to non-self-describing formats using reflection. ## Solution Add support for non-self-describing de/serialization using reflection. This allows us to use binary formatters, like [`postcard`](https://crates.io/crates/postcard): ```rust #[derive(Reflect, FromReflect, Debug, PartialEq)] struct Foo { data: String } let mut registry = TypeRegistry::new(); registry.register::<Foo>(); let input = Foo { data: "Hello world!".to_string() }; // === Serialize! === // let serializer = ReflectSerializer::new(&input, ®istry); let bytes: Vec<u8> = postcard::to_allocvec(&serializer).unwrap(); println!("{:?}", bytes); // Output: [129, 217, 61, 98, ...] // === Deserialize! === // let deserializer = UntypedReflectDeserializer::new(®istry); let dynamic_output = deserializer .deserialize(&mut postcard::Deserializer::from_bytes(&bytes)) .unwrap(); let output = <Foo as FromReflect>::from_reflect(dynamic_output.as_ref()).unwrap(); assert_eq!(expected, output); // OK! ``` #### Crates Tested - ~~[`rmp-serde`](https://crates.io/crates/rmp-serde)~~ Apparently, this _is_ self-describing - ~~[`bincode` v2.0.0-rc.1](https://crates.io/crates/bincode/2.0.0-rc.1) (using [this PR](https://github.com/bincode-org/bincode/pull/586))~~ This actually works for the latest release (v1.3.3) of [`bincode`](https://crates.io/crates/bincode) as well. You just need to be sure to use fixed-int encoding. - [`postcard`](https://crates.io/crates/postcard) ## Future Work Ideally, we would refactor the `serde` module, but I don't think I'll do that in this PR so as to keep the diff relatively small (and to avoid any painful rebases). This should probably be done once this is merged, though. Some areas we could improve with a refactor: * Split deserialization logic across multiple files * Consolidate helper functions/structs * Make the logic more DRY --- ## Changelog - Add support for non-self-describing de/serialization using reflection. Co-authored-by: Gino Valente <49806985+MrGVSV@users.noreply.github.com>
44 lines
1.3 KiB
TOML
44 lines
1.3 KiB
TOML
[package]
|
|
name = "bevy_reflect"
|
|
version = "0.9.0-dev"
|
|
edition = "2021"
|
|
description = "Dynamically interact with rust types"
|
|
homepage = "https://bevyengine.org"
|
|
repository = "https://github.com/bevyengine/bevy"
|
|
license = "MIT OR Apache-2.0"
|
|
keywords = ["bevy"]
|
|
readme = "README.md"
|
|
|
|
[features]
|
|
default = []
|
|
# Provides Bevy-related reflection implementations
|
|
bevy = ["glam", "smallvec", "bevy_math"]
|
|
# When enabled, allows documentation comments to be accessed via reflection
|
|
documentation = ["bevy_reflect_derive/documentation"]
|
|
|
|
[dependencies]
|
|
# bevy
|
|
bevy_math = { path = "../bevy_math", version = "0.9.0-dev", features = ["serialize"], optional = true }
|
|
bevy_reflect_derive = { path = "bevy_reflect_derive", version = "0.9.0-dev" }
|
|
bevy_utils = { path = "../bevy_utils", version = "0.9.0-dev" }
|
|
bevy_ptr = { path = "../bevy_ptr", version = "0.9.0-dev" }
|
|
|
|
# other
|
|
erased-serde = "0.3"
|
|
downcast-rs = "1.2"
|
|
parking_lot = "0.12.1"
|
|
thiserror = "1.0"
|
|
once_cell = "1.11"
|
|
serde = "1"
|
|
smallvec = { version = "1.6", features = ["serde", "union", "const_generics"], optional = true }
|
|
glam = { version = "0.21", features = ["serde"], optional = true }
|
|
|
|
[dev-dependencies]
|
|
ron = "0.8.0"
|
|
rmp-serde = "1.1"
|
|
bincode = "1.3"
|
|
|
|
[[example]]
|
|
name = "reflect_docs"
|
|
path = "examples/reflect_docs.rs"
|
|
required-features = ["documentation"]
|