You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 17:45:06