{"record":{"id":"7c23b81bc3e7174c","repo":"EllanJiang/GameFramework","slug":"deserialize-callback-is-invalid","errorCode":null,"errorMessage":"Deserialize callback is invalid.","messagePattern":"Deserialize callback is invalid\\.","errorType":"exception","errorClass":"GameFrameworkException","httpStatus":null,"severity":"error","filePath":"GameFramework/Base/GameFrameworkSerializer.cs","lineNumber":87,"sourceCode":"            }\n\n            m_SerializeCallbacks[version] = callback;\n            if (version > m_LatestSerializeCallbackVersion)\n            {\n                m_LatestSerializeCallbackVersion = version;\n            }\n        }\n\n        /// <summary>\n        /// 注册反序列化回调函数。\n        /// </summary>\n        /// <param name=\"version\">反序列化回调函数的版本。</param>\n        /// <param name=\"callback\">反序列化回调函数。</param>\n        public void RegisterDeserializeCallback(byte version, DeserializeCallback callback)\n        {\n            if (callback == null)\n            {\n                throw new GameFrameworkException(\"Deserialize callback is invalid.\");\n            }\n\n            m_DeserializeCallbacks[version] = callback;\n        }\n\n        /// <summary>\n        /// 注册尝试从指定流获取指定键的值回调函数。\n        /// </summary>\n        /// <param name=\"version\">尝试从指定流获取指定键的值回调函数的版本。</param>\n        /// <param name=\"callback\">尝试从指定流获取指定键的值回调函数。</param>\n        public void RegisterTryGetValueCallback(byte version, TryGetValueCallback callback)\n        {\n            if (callback == null)\n            {\n                throw new GameFrameworkException(\"Try get value callback is invalid.\");\n            }\n\n            m_TryGetValueCallbacks[version] = callback;","sourceCodeStart":69,"sourceCodeEnd":105,"githubUrl":"https://github.com/EllanJiang/GameFramework/blob/d0c010b05167c58e92350449d04864a91ca13fd2/GameFramework/Base/GameFrameworkSerializer.cs#L69-L105","documentation":"GameFrameworkSerializer<T> stores per-version deserialize callbacks used when reading data back from a stream. RegisterDeserializeCallback throws when the callback parameter is null, preventing a deferred NullReferenceException during Deserialize.","triggerScenarios":"Calling serializer.RegisterDeserializeCallback(version, null), typically from a typo, an unassigned delegate field, or a failed lookup that returned null.","commonSituations":"Registering callbacks dynamically where the reflected MethodInfo is missing, or a refactor removed the handler method while the registration call remained.","solutions":["Pass a valid non-null DeserializeCallback delegate for the target version.","Confirm the handler method still exists and its signature matches DeserializeCallback after refactors.","Add a null check/log around dynamic callback resolution before registration.","Ensure every version you serialize also has a matching deserialize callback registered."],"exampleFix":"// before\nserializer.RegisterDeserializeCallback(1, GetHandler()); // GetHandler() returned null\n// after\nvar handler = GetHandler();\nif (handler != null)\n{\n    serializer.RegisterDeserializeCallback(1, handler);\n}","handlingStrategy":"validation","validationCode":"if (callback == null) { throw new InvalidOperationException(\"Deserialize callback required.\"); }\nserializer.RegisterDeserializeCallback(version, callback);","typeGuard":"static bool IsValidCallback(GameFrameworkSerializer<T>.DeserializeCallback cb) => cb != null;","tryCatchPattern":"try { serializer.RegisterDeserializeCallback(version, callback); } catch (GameFrameworkException) { /* log null callback registration attempt */ }","preventionTips":["Verify handler methods exist after refactors","Pair every RegisterSerializeCallback with a matching deserialize registration","Add a startup assertion that all versions have both callbacks"],"tags":["csharp","null-argument","serialization","callback"],"backgroundTag":"null-argument","analyzedSha":"d0c010b05167c58e92350449d04864a91ca13fd2","analyzedAt":"2026-09-15T13:37:15.352Z","contentChangedAt":"2026-09-15T13:37:15.352Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}