{"record":{"id":"e6e7cedbf2fa9906","repo":"FyroxEngine/Fyrox","slug":"visitor-environment-must-contain-serialization-con","errorCode":null,"errorMessage":"Visitor environment must contain serialization context!","messagePattern":"Visitor environment must contain serialization context!","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"fyrox-impl/src/scene/node/container.rs","lineNumber":46,"sourceCode":"};\nuse fyrox_core::visitor::error::VisitError;\n\n/// A wrapper for node pool record that allows to define custom visit method to have full\n/// control over instantiation process at deserialization.\n#[derive(Debug, Clone, Default, PartialEq, Reflect)]\n#[reflect(type_uuid = \"be27db20-c0b0-491e-9421-8b1ebc357b9a\")]\npub struct NodeContainer(Option<Node>);\n\nfn read_node(name: &str, visitor: &mut Visitor) -> Result<Node, VisitError> {\n    let mut region = visitor.enter_region(name)?;\n\n    let mut id = Uuid::default();\n    id.visit(\"TypeUuid\", &mut region)?;\n\n    let serialization_context = region\n        .blackboard\n        .get::<SerializationContext>()\n        .expect(\"Visitor environment must contain serialization context!\");\n\n    let mut node = serialization_context\n        .node_constructors\n        .try_create(&id)\n        .ok_or_else(|| VisitError::User(format!(\"Unknown node type uuid {id}!\")))?;\n\n    node.visit(\"NodeData\", &mut region)?;\n\n    Ok(node)\n}\n\nfn write_node(name: &str, node: &mut Node, visitor: &mut Visitor) -> VisitResult {\n    let mut region = visitor.enter_region(name)?;\n\n    let mut id = node.id();\n    id.visit(\"TypeUuid\", &mut region)?;\n\n    node.visit(\"NodeData\", &mut region)?;","sourceCodeStart":28,"sourceCodeEnd":64,"githubUrl":"https://github.com/FyroxEngine/Fyrox/blob/76c91aad8eca488ce527b1af707be8b3b24ad72d/fyrox-impl/src/scene/node/container.rs#L28-L64","documentation":"Fyrox scene nodes are created from a registry of constructor functions keyed by type UUID. During deserialization, read_node looks up this registry in the Visitor's blackboard (SerializationContext) and panics with this message if it was never installed. The library requires the caller to provide the serialization context before visiting scene data.","triggerScenarios":"Calling Node::visit / resource loading on a Visitor that was built without calling visitor.environment.mapping.insert or without using a loader that registers the SerializationContext (e.g. manually constructing a Visitor instead of using the resource manager or SceneLoader).","commonSituations":"Manually deserializing a saved scene with a hand-built Visitor; loading scenes in a test or editor tool that skipped Fyrox's standard resource-loading path; refactoring code that used to call a context-registering helper.","solutions":["Register the SerializationContext in the visitor blackboard before visiting, e.g. visitor.blackboard.register(serialization_context) or use visitor.environment.mapping.insert::<SerializationContext>(ctx).","Load scenes through SceneLoader / ResourceManager instead of calling visit on a raw Visitor, so the context is installed automatically.","If running tests, use the shared SerializationContext (via RESOURCE_STATE_SERIALIZATION_CONTEXT or the crate's test helpers) when constructing the visitor."],"exampleFix":"// before\nlet mut visitor = Visitor::new();\nnode.save(\"scene.ron\")?; // later read panics\n// after\nlet mut visitor = Visitor::new();\nvisitor.blackboard.register(serialization_context.clone());\nnode.save(\"scene.ron\")?;","handlingStrategy":"validation","validationCode":"assert!(visitor.blackboard.get_opt::<SerializationContext>().is_some(),\n    \"register SerializationContext before visiting\");","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Register SerializationContext on any Visitor used for scene deserialization","Prefer ResourceManager-based loaders over manual visiting"],"tags":["deserialization","panic","missing-context","fyrox"],"backgroundTag":"missing-required-config","analyzedSha":"76c91aad8eca488ce527b1af707be8b3b24ad72d","analyzedAt":"2026-09-10T16:04:01.633Z","contentChangedAt":"2026-09-10T16:04:01.633Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}