Skip to content

Commit 755185b

Browse files
committed
Fix broken deserialization of readers
1 parent c55d553 commit 755185b

File tree

3 files changed

+52
-5
lines changed

3 files changed

+52
-5
lines changed

crates/bevy_reflect/src/serde/de.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1536,10 +1536,11 @@ mod tests {
15361536
108, 101, 144, 146, 100, 145, 101,
15371537
];
15381538

1539-
let deserializer = UntypedReflectDeserializer::new(&registry);
1539+
let mut reader = std::io::BufReader::new(input.as_slice());
15401540

1541+
let deserializer = UntypedReflectDeserializer::new(&registry);
15411542
let dynamic_output = deserializer
1542-
.deserialize(&mut rmp_serde::Deserializer::new(input.as_slice()))
1543+
.deserialize(&mut rmp_serde::Deserializer::new(&mut reader))
15431544
.unwrap();
15441545

15451546
let output = <MyStruct as FromReflect>::from_reflect(dynamic_output.as_ref()).unwrap();

crates/bevy_scene/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,4 @@ thiserror = "1.0"
3434
[dev-dependencies]
3535
postcard = { version = "1.0", features = ["alloc"] }
3636
bincode = "1.3"
37+
rmp-serde = "1.1"

crates/bevy_scene/src/serde.rs

Lines changed: 48 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -352,14 +352,14 @@ impl<'a, 'de> Visitor<'de> for ComponentVisitor<'a> {
352352
{
353353
let mut added = HashSet::new();
354354
let mut components = Vec::new();
355-
while let Some(key) = map.next_key::<&str>()? {
356-
if !added.insert(key) {
355+
while let Some(key) = map.next_key::<String>()? {
356+
if !added.insert(key.clone()) {
357357
return Err(Error::custom(format!("duplicate component: `{key}`")));
358358
}
359359

360360
let registration = self
361361
.registry
362-
.get_with_name(key)
362+
.get_with_name(&key)
363363
.ok_or_else(|| Error::custom(format!("no registration found for `{key}`")))?;
364364
components.push(
365365
map.next_value_seed(TypedReflectDeserializer::new(registration, self.registry))?,
@@ -394,6 +394,8 @@ mod tests {
394394
use bevy_reflect::{FromReflect, Reflect, ReflectSerialize};
395395
use bincode::Options;
396396
use serde::de::DeserializeSeed;
397+
use serde::Serialize;
398+
use std::io::BufReader;
397399

398400
#[derive(Component, Reflect, Default)]
399401
#[reflect(Component)]
@@ -567,6 +569,49 @@ mod tests {
567569
assert_scene_eq(&scene, &deserialized_scene);
568570
}
569571

572+
#[test]
573+
fn should_roundtrip_messagepack() {
574+
let mut world = create_world();
575+
576+
world.spawn(MyComponent {
577+
foo: [1, 2, 3],
578+
bar: (1.3, 3.7),
579+
baz: MyEnum::Tuple("Hello World!".to_string()),
580+
});
581+
582+
let registry = world.resource::<AppTypeRegistry>();
583+
584+
let scene = DynamicScene::from_world(&world, registry);
585+
586+
let scene_serializer = SceneSerializer::new(&scene, &registry.0);
587+
let mut buf = Vec::new();
588+
let mut ser = rmp_serde::Serializer::new(&mut buf);
589+
scene_serializer.serialize(&mut ser).unwrap();
590+
591+
assert_eq!(
592+
vec![
593+
145, 129, 0, 145, 129, 217, 37, 98, 101, 118, 121, 95, 115, 99, 101, 110, 101, 58,
594+
58, 115, 101, 114, 100, 101, 58, 58, 116, 101, 115, 116, 115, 58, 58, 77, 121, 67,
595+
111, 109, 112, 111, 110, 101, 110, 116, 147, 147, 1, 2, 3, 146, 202, 63, 166, 102,
596+
102, 202, 64, 108, 204, 205, 129, 165, 84, 117, 112, 108, 101, 172, 72, 101, 108,
597+
108, 111, 32, 87, 111, 114, 108, 100, 33
598+
],
599+
buf
600+
);
601+
602+
let scene_deserializer = SceneDeserializer {
603+
type_registry: &registry.0.read(),
604+
};
605+
let mut reader = BufReader::new(buf.as_slice());
606+
607+
let deserialized_scene = scene_deserializer
608+
.deserialize(&mut rmp_serde::Deserializer::new(&mut reader))
609+
.unwrap();
610+
611+
assert_eq!(1, deserialized_scene.entities.len());
612+
assert_scene_eq(&scene, &deserialized_scene);
613+
}
614+
570615
#[test]
571616
fn should_roundtrip_bincode() {
572617
let mut world = create_world();

0 commit comments

Comments
 (0)