MonoGame中Quest类实例JSON存取值重置问题求助
问题解决步骤
1. 处理MonoGame复杂类型的序列化缺失
System.Text.Json默认不支持MonoGame的Color类型,这会导致包含该类型的属性无法正确序列化/反序列化,进而可能牵连其他属性的读取。需要为Color编写自定义转换器:
using System.Text.Json; using System.Text.Json.Serialization; using Microsoft.Xna.Framework; public class ColorJsonConverter : JsonConverter<Color> { public override Color Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { // 从十六进制字符串解析Color string hexStr = reader.GetString()?.TrimStart('#') ?? "FFFFFFFF"; byte r = byte.Parse(hexStr.Substring(0, 2), System.Globalization.NumberStyles.HexNumber); byte g = byte.Parse(hexStr.Substring(2, 2), System.Globalization.NumberStyles.HexNumber); byte b = byte.Parse(hexStr.Substring(4, 2), System.Globalization.NumberStyles.HexNumber); byte a = hexStr.Length == 8 ? byte.Parse(hexStr.Substring(6, 2), System.Globalization.NumberStyles.HexNumber) : (byte)255; return new Color(r, g, b, a); } public override void Write(Utf8JsonWriter writer, Color value, JsonSerializerOptions options) { // 将Color序列化为带Alpha的十六进制字符串 writer.WriteStringValue($"#{value.R:X2}{value.G:X2}{value.B:X2}{value.A:X2}"); } }
2. 配置序列化选项并应用转换器
在序列化和反序列化GameData时,必须传入包含自定义转换器的JsonSerializerOptions,同时处理DateTime/TimeSpan的潜在问题:
// 初始化序列化配置 var jsonOptions = new JsonSerializerOptions { Converters = { new ColorJsonConverter() }, PropertyNameCaseInsensitive = true, // 解决大小写不匹配导致的属性读取失败 WriteIndented = true // 可选,让JSON更易读 }; // 序列化保存 string saveJson = JsonSerializer.Serialize(yourGameDataInstance, jsonOptions); File.WriteAllText("game_save.json", saveJson); // 反序列化加载 GameData loadedData = JsonSerializer.Deserialize<GameData>(File.ReadAllText("game_save.json"), jsonOptions);
3. 检查Quest类的属性定义
确保需要保存的属性是可读写的,且没有被[JsonIgnore]标记:
public class Quest { public int Total { get; set; } // 必须有get和set方法,否则无法反序列化赋值 public Color QuestHighlightColor { get; set; } public DateTime QuestStart { get; set; } public TimeSpan QuestDuration { get; set; } // 其他业务属性... }
4. 验证序列化结果
打开生成的JSON文件,确认Total等属性的数值是否正确写入。如果JSON中Total是4但加载后为0,大概率是属性名大小写不匹配,此时PropertyNameCaseInsensitive = true可以解决该问题。
内容的提问来源于stack exchange,提问作者asdrubale cazzituoi
相关产品推荐
相关产品推荐

