{"record":{"id":"ce21fe05262d30b9","repo":"EllanJiang/GameFramework","slug":"serialize-callback-0-is-not-exist","errorCode":null,"errorMessage":"Serialize callback '{0}' is not exist.","messagePattern":"Serialize callback '(.+?)' is not exist\\.","errorType":"exception","errorClass":"GameFrameworkException","httpStatus":null,"severity":"error","filePath":"GameFramework/Base/GameFrameworkSerializer.cs","lineNumber":141,"sourceCode":"\n        /// <summary>\n        /// 序列化数据到目标流中。\n        /// </summary>\n        /// <param name=\"stream\">目标流。</param>\n        /// <param name=\"data\">要序列化的数据。</param>\n        /// <param name=\"version\">序列化回调函数的版本。</param>\n        /// <returns>是否序列化数据成功。</returns>\n        public bool Serialize(Stream stream, T data, byte version)\n        {\n            byte[] header = GetHeader();\n            stream.WriteByte(header[0]);\n            stream.WriteByte(header[1]);\n            stream.WriteByte(header[2]);\n            stream.WriteByte(version);\n            SerializeCallback callback = null;\n            if (!m_SerializeCallbacks.TryGetValue(version, out callback))\n            {\n                throw new GameFrameworkException(Utility.Text.Format(\"Serialize callback '{0}' is not exist.\", version));\n            }\n\n            return callback(stream, data);\n        }\n\n        /// <summary>\n        /// 从指定流反序列化数据。\n        /// </summary>\n        /// <param name=\"stream\">指定流。</param>\n        /// <returns>反序列化的数据。</returns>\n        public T Deserialize(Stream stream)\n        {\n            byte[] header = GetHeader();\n            byte header0 = (byte)stream.ReadByte();\n            byte header1 = (byte)stream.ReadByte();\n            byte header2 = (byte)stream.ReadByte();\n            if (header0 != header[0] || header1 != header[1] || header2 != header[2])\n            {","sourceCodeStart":123,"sourceCodeEnd":159,"githubUrl":"https://github.com/EllanJiang/GameFramework/blob/d0c010b05167c58e92350449d04864a91ca13fd2/GameFramework/Base/GameFrameworkSerializer.cs#L123-L159","documentation":"The explicit-version Serialize(stream, data, version) looks up the callback registered for that exact version byte. It throws when the stream's header was accepted but no serialize callback exists for the requested version, using a formatted message that names the version.","triggerScenarios":"Calling Serialize(stream, data, version) with a version byte that was never passed to RegisterSerializeCallback, or where callbacks were registered for different versions than the one requested.","commonSituations":"Version mismatch after upgrading serialization code (data saved/loaded with a version whose callback was removed); hard-coded version constants that no longer match registrations; loading old saves whose version numbers aren't registered in the new build.","solutions":["Register a serialize callback for every version you pass/request, including legacy versions.","Confirm the version constant passed to Serialize matches one used in RegisterSerializeCallback.","Check m_SerializeCallbacks.ContainsKey(version) before serializing, or route through the versionless overload that uses the latest registered version.","Keep registrations centralized (one registration table) so versions stay in sync across builds."],"exampleFix":"// before\nserializer.Serialize(stream, data, 2); // only version 1 registered\n// after\nif (!serializer.HasSerializeCallback(2)) // or check your registry\n{\n    serializer.RegisterSerializeCallback(2, SerializePlayerDataV2);\n}\nserializer.Serialize(stream, data, 2);","handlingStrategy":"validation","validationCode":"var supported = new byte[] { 1, 2 }; // versions with registered callbacks\nif (!supported.Contains(version)) { version = supported.Max(); }","typeGuard":"static bool VersionSupported(ISet<byte> registered, byte version) => registered.Contains(version);","tryCatchPattern":"try { serializer.Serialize(stream, data, version); } catch (GameFrameworkException ex) { log.Error(\"Unsupported serialize version: \" + ex.Message); }","preventionTips":["Keep a single table of registered versions shared by all call sites","Use constants/enum for versions instead of literals","Re-register legacy version callbacks when migrating formats"],"tags":["csharp","version-mismatch","serialization","missing-registration"],"backgroundTag":"resource-not-found","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"}