{"record":{"id":"e5ba2caaf9544b5d","repo":"EllanJiang/GameFramework","slug":"name-is-invalid-updatableversionlist-asset","errorCode":null,"errorMessage":"Name is invalid.","messagePattern":"Name is invalid\\.","errorType":"exception","errorClass":"GameFrameworkException","httpStatus":null,"severity":"error","filePath":"GameFramework/Resource/UpdatableVersionList.Asset.cs","lineNumber":34,"sourceCode":"        /// </summary>\n        [StructLayout(LayoutKind.Auto)]\n        public struct Asset\n        {\n            private static readonly int[] EmptyIntArray = new int[] { };\n\n            private readonly string m_Name;\n            private readonly int[] m_DependencyAssetIndexes;\n\n            /// <summary>\n            /// 初始化资源的新实例。\n            /// </summary>\n            /// <param name=\"name\">资源名称。</param>\n            /// <param name=\"dependencyAssetIndexes\">资源包含的依赖资源索引集合。</param>\n            public Asset(string name, int[] dependencyAssetIndexes)\n            {\n                if (string.IsNullOrEmpty(name))\n                {\n                    throw new GameFrameworkException(\"Name is invalid.\");\n                }\n\n                m_Name = name;\n                m_DependencyAssetIndexes = dependencyAssetIndexes ?? EmptyIntArray;\n            }\n\n            /// <summary>\n            /// 获取资源名称。\n            /// </summary>\n            public string Name\n            {\n                get\n                {\n                    return m_Name;\n                }\n            }\n\n            /// <summary>","sourceCodeStart":16,"sourceCodeEnd":52,"githubUrl":"https://github.com/EllanJiang/GameFramework/blob/d0c010b05167c58e92350449d04864a91ca13fd2/GameFramework/Resource/UpdatableVersionList.Asset.cs#L16-L52","documentation":"The Asset class nested in UpdatableVersionList validates the asset name in its constructor because each asset must be identified by name within the update list. A null or empty name is rejected with a GameFrameworkException at construction. This keeps the updatable version list free of unidentifiable entries.","triggerScenarios":"Constructing UpdatableVersionList.Asset directly, or deserializing an updatable version list whose asset entry has a null or empty name.","commonSituations":"Corrupted update version file from a bad download, packaging tool output missing the name field, or binary parse reading an empty string due to offset/length mistakes.","solutions":["Pass a valid non-empty asset name to the Asset constructor","Regenerate the updatable version list with the packaging pipeline","Fix the deserialization logic so the name field is populated"],"exampleFix":"// before\nnew Asset(null, dependencyAssetIndexes);\n// after\nif (string.IsNullOrEmpty(name)) throw new ArgumentException(\"Asset name required\");\nnew Asset(name, dependencyAssetIndexes);","handlingStrategy":"validation","validationCode":"if (string.IsNullOrEmpty(assetName)) { Log.Error(\"Asset entry missing name\"); return; }","typeGuard":"bool IsValidAssetEntry(string n) => !string.IsNullOrEmpty(n);","tryCatchPattern":"try { var a = new Asset(name, deps); } catch (GameFrameworkException ex) when (ex.Message == \"Name is invalid.\") { Log.Error(ex, \"Invalid asset entry in version list\"); }","preventionTips":["Validate update-version-list entries at parse time","Checksum update files before parsing","Fix parsers to read name fields with correct offsets/lengths"],"tags":["resource","version-list","constructor"],"backgroundTag":"invalid-constructor-argument","analyzedSha":"d0c010b05167c58e92350449d04864a91ca13fd2","analyzedAt":"2026-09-15T13:37:15.352Z","contentChangedAt":"2026-09-15T13:37:15.352Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}