{"record":{"id":"c3f78e9d7db6fc1d","repo":"stride3d/stride","slug":"error-when-serializing-reference","errorCode":null,"errorMessage":"Error when serializing reference.","messagePattern":"Error when serializing reference\\.","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"sources/core/Stride.Core.Serialization/Serialization/Contents/ReferenceSerializer.cs","lineNumber":88,"sourceCode":"                    }\n                }\n            }\n        }\n        else if (referenceSerialization == ContentSerializerContext.AttachedReferenceSerialization.AsNull)\n        {\n            if (mode == ArchiveMode.Deserialize)\n            {\n                obj = default;\n            }\n        }\n        else if (referenceSerialization == ContentSerializerContext.AttachedReferenceSerialization.AsSerializableVersion)\n        {\n            if (mode == ArchiveMode.Serialize)\n            {\n                // This case will happen when serializing build engine command hashes: we still want Location to still be written\n                var attachedReference = AttachedReferenceManager.GetAttachedReference(obj);\n                if (attachedReference?.Url == null)\n                    throw new InvalidOperationException(\"Error when serializing reference.\");\n\n                // TODO: Do not use string\n                stream.Write(obj.GetType().AssemblyQualifiedName);\n                stream.Write(attachedReference.Id);\n                stream.Write(attachedReference.Url);\n            }\n            else\n            {\n                var type = AssemblyRegistry.GetType(stream.ReadString());\n                var id = stream.Read<AssetId>();\n                var url = stream.ReadString();\n\n                obj = (T)AttachedReferenceManager.CreateProxyObject(type, id, url);\n            }\n        }\n        else if (referenceSerialization == ContentSerializerContext.AttachedReferenceSerialization.Clone)\n        {\n            var cloneReferences = stream.Context.Get(ReferenceSerializer.CloneReferences);","sourceCodeStart":70,"sourceCodeEnd":106,"githubUrl":"https://github.com/stride3d/stride/blob/96fad776d210c221682aac1ccdf4c79dc046fc38/sources/core/Stride.Core.Serialization/Serialization/Contents/ReferenceSerializer.cs#L70-L106","documentation":"In ArchiveMode.Serialize, ReferenceSerializer writes the object's attached reference (Id + Url). If the object has no attached reference or its Url is null, there is no location to write, so the library throws instead of emitting an unresolvable reference.","triggerScenarios":"Serializing an object that is an IReferencable without attached reference metadata (not created/tracked by the content system), e.g. during build engine command hash computation when the object was constructed in memory rather than loaded.","commonSituations":"Manually instantiating an asset class with 'new' and saving it; passing a runtime-created object into a serialization path that expects content-managed objects; objects whose AttachedReference was stripped.","solutions":["Ensure the object was created/loaded through the ContentManager so it has an attached reference with a Url","Attach reference metadata manually via AttachedReferenceManager before serializing","Skip/guard serialization paths that only need hashes by giving the object a valid Url"],"exampleFix":"// before\nvar tex = new Texture();\ncontentManager.Save(\"out\", wrapper); // throws: no attached reference\n// after\nvar tex = contentManager.Load<Texture>(\"my-texture\"); // has attached reference\ncontentManager.Save(\"out\", wrapper);","handlingStrategy":"validation","validationCode":"var ar = AttachedReferenceManager.GetAttachedReference(obj);\nif (ar?.Url == null) throw new InvalidOperationException($\"{obj.GetType().Name} has no attached content reference; load it via ContentManager\");","typeGuard":"static bool IsSerializableReference(object o) => AttachedReferenceManager.GetAttachedReference(o)?.Url != null;","tryCatchPattern":"try { SerializeRef(stream, obj); }\ncatch (InvalidOperationException ex) when (ex.Message == \"Error when serializing reference.\") { // object lacks attached reference\n}","preventionTips":["Only serialize objects obtained from ContentManager","Attach reference metadata manually for in-memory objects that must be persisted","Unit-test reference serialization for custom object lifecycles"],"tags":["serialization","assets","null-url"],"backgroundTag":"empty-required-field","analyzedSha":"96fad776d210c221682aac1ccdf4c79dc046fc38","analyzedAt":"2026-09-14T02:59:31.279Z","contentChangedAt":"2026-09-14T02:59:31.279Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}