C#控制台应用使用序列化存取变量加载为空问题咨询
问题解答
- 存值时可以直接用变量名赋值,你当前写的存值代码完全符合要求,不是存值方式导致的加载失败。
- 加载后变量为空的核心原因:你仅完成了存档文件到
stateVariables对象的反序列化操作,没有把stateVariables中存储的属性值同步回业务逻辑使用的静态变量。和你已经实现的装备、药水、经验变量赋值逻辑一致,其他游戏数值相关的静态变量也需要手动从stateVariables中读取赋值。
修正后的加载代码示例
string folder = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); folder = Path.Combine(folder, "RNGgameSaveFiles"); Directory.CreateDirectory(folder); string dataFile = Path.Combine(folder, "RNGgameSaveFileV1"); if (File.Exists(dataFile)) { using (Stream stateStream = File.OpenRead(dataFile)) { BinaryFormatter deserializer = new BinaryFormatter(); stateVariables = (AppState)deserializer.Deserialize(stateStream); // 同步静态变量值 roundsPlayed = stateVariables.roundsPlayed; money = stateVariables.money; totalMoneyEarned = stateVariables.totalMoneyEarned; totalScore = stateVariables.totalScore; totalKills = stateVariables.totalKills; totalLosses = stateVariables.totalLosses; // 原有已实现的变量赋值 equipedShield = stateVariables.equipedShield; equipedWeapon = stateVariables.equipedWeapon; healthPotionCount = stateVariables.healthPotionCount; playerExpEarned = stateVariables.playerExpEarned; // 其他AppState中定义的属性如果有对应静态变量,在此处补充赋值即可 } }
额外优化建议
BinaryFormatter存在已知的安全风险,微软官方已不推荐用于生产环境。后续迭代时可以改用JSON序列化方案,序列化后的存档为明文结构,调试更方便,安全性也更高。
内容的提问来源于stack exchange,提问作者noobyprogrammer
相关产品推荐
相关产品推荐

