mirror of
https://github.com/FyroxEngine/Fyrox.git
synced 2026-10-12 02:02:20 +00:00
use visitor's version number when deserializing vectors
This commit is contained in:
@@ -142,21 +142,11 @@ where
|
||||
T: Default + Visit + 'static,
|
||||
{
|
||||
fn visit(&mut self, name: &str, visitor: &mut Visitor) -> VisitResult {
|
||||
const VERSION_VERBOSE: u32 = 0;
|
||||
const VERSION_CURRENT: u32 = 1;
|
||||
|
||||
let mut region = visitor.enter_region(name)?;
|
||||
|
||||
let mut len = self.len() as u32;
|
||||
len.visit("Length", &mut region)?;
|
||||
|
||||
let mut version = VERSION_CURRENT;
|
||||
if region.is_reading() && version.visit("Version", &mut region).is_err() {
|
||||
version = VERSION_VERBOSE;
|
||||
} else {
|
||||
version.visit("Version", &mut region)?;
|
||||
}
|
||||
|
||||
fn make_name(i: usize) -> String {
|
||||
format!("Item{i}")
|
||||
}
|
||||
@@ -165,22 +155,18 @@ where
|
||||
self.clear();
|
||||
for index in 0..len as usize {
|
||||
// Backward compatibility with the previous version (verbose, non-flat).
|
||||
if version == VERSION_VERBOSE {
|
||||
if region.version == 0 {
|
||||
if let Ok(mut item_region) = region.enter_region(&make_name(index)) {
|
||||
let mut object = T::default();
|
||||
object.visit("ItemData", &mut item_region)?;
|
||||
self.push(object);
|
||||
continue;
|
||||
}
|
||||
} else if version == VERSION_CURRENT {
|
||||
} else {
|
||||
// Try to read the new (flattened) version.
|
||||
let mut object = T::default();
|
||||
object.visit(&make_name(index), &mut region)?;
|
||||
self.push(object);
|
||||
} else {
|
||||
return Err(VisitError::User(format!(
|
||||
"Unknown vector version {version}!"
|
||||
)));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
||||
@@ -524,6 +524,11 @@ impl Visitor {
|
||||
self.nodes.borrow_mut(self.current_node)
|
||||
}
|
||||
|
||||
/// Returns version number of the visitor.
|
||||
pub fn version(&self) -> u32 {
|
||||
self.version
|
||||
}
|
||||
|
||||
/// If [Visitor::is_reading], find a node with the given name that is a child of the current
|
||||
/// node, and return a Visitor for the found node. Return an error if no node with that name exists.
|
||||
///
|
||||
|
||||
Reference in New Issue
Block a user