{"record":{"id":"eadb1bcb3d4b9207","repo":"stride3d/stride","slug":"setassetobject-has-already-been-called-with-a-different","errorCode":null,"errorMessage":"SetAssetObject has already been called with a different object","messagePattern":"SetAssetObject has already been called with a different object","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"sources/core/Stride.Core.Serialization/Serialization/Contents/ContentManager.cs","lineNumber":631,"sourceCode":"                if (attachedReference?.IsProxy != false)\n                    continue;\n\n                serializeOperations.Enqueue(new SerializeOperation(contentReference.Location, contentReference.ObjectValue, false));\n            }\n        }\n    }\n\n    /// <summary>\n    /// Sets Reference.Object, and updates loadedAssetByUrl collection.\n    /// </summary>\n    internal void SetAssetObject(Reference reference, object obj)\n    {\n        ArgumentNullException.ThrowIfNull(obj);\n\n        if (reference.Object != null)\n        {\n            if (reference.Object != obj)\n                throw new InvalidOperationException(\"SetAssetObject has already been called with a different object\");\n\n            return;\n        }\n\n        var url = reference.Url;\n        reference.Object = obj;\n\n        lock (LoadedAssetUrls)\n        {\n            if (LoadedAssetUrls.TryGetValue(url, out var previousReference))\n            {\n                reference.Next = previousReference.Next;\n                reference.Prev = previousReference;\n\n                if (previousReference.Next != null)\n                    previousReference.Next.Prev = reference;\n                previousReference.Next = reference;\n            }","sourceCodeStart":613,"sourceCodeEnd":649,"githubUrl":"https://github.com/stride3d/stride/blob/96fad776d210c221682aac1ccdf4c79dc046fc38/sources/core/Stride.Core.Serialization/Serialization/Contents/ContentManager.cs#L613-L649","documentation":"ContentManager.SetAssetObject registers a deserialized object instance onto an object reference. If the reference already holds a different object instance, the internal object/reference bookkeeping is inconsistent, so the library throws InvalidOperationException to surface the corruption early rather than silently swapping assets.","triggerScenarios":"Calling SetAssetObject with an object that differs from the one already stored in reference.Object; happens internally via RegisterDeserializedObject, DeserializeObject, or SerializeObject when the same ObjectReference is reused across two different asset instances.","commonSituations":"Reusing a loaded asset's ObjectReference as the target for a second deserialization; sharing asset references across two ContentManager loads; a serialization bug that leaves a stale Object property on a reference being repopulated.","solutions":["Do not reuse the same ObjectReference instance for two different asset objects; create a fresh reference per deserialization","Ensure the object passed to SetAssetObject is the exact instance already assigned to reference.Object (reference equality)","If intentionally replacing, null out reference.Object before calling SetAssetObject","Audit custom serialization code (IDataSerializer implementations) that may share references between asset instances"],"exampleFix":"// before\nreference.Object = otherInstance;\nmanager.SetAssetObject(reference, newObj); // throws\n// after\nvar freshReference = new ObjectReference(reference.Url);\nmanager.SetAssetObject(freshReference, newObj);","handlingStrategy":"try-catch","validationCode":"if (reference.Object != null && !ReferenceEquals(reference.Object, obj))\n    throw new InvalidOperationException(\"Reference already bound to a different object\");","typeGuard":"static bool CanSetAssetObject(ObjectReference r, object obj) => r.Object == null || ReferenceEquals(r.Object, obj);","tryCatchPattern":"try { manager.SetAssetObject(reference, obj); }\ncatch (InvalidOperationException) { // reference already bound to a different object\n  reference.Object = null; manager.SetAssetObject(reference, obj); }","preventionTips":["Never reuse ObjectReference instances across different asset objects","Rely on ContentManager load/store instead of manual reference mutation","Track reference identity with the asset it was created for"],"tags":["serialization","assets","invalid-state"],"backgroundTag":"internal-invariant-violation","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"}