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

Unity中JsonConvert反序列化Vector2Int失败问题求助

解决Unity中Newtonsoft.Json反序列化Vector2Int的问题

首先,你的自定义Vec2Converter反序列化逻辑存在明显问题,这是导致Vector2Int无法正确转换的核心原因;另外Unity崩溃的情况大概率和旧序列化数据与新类型不兼容有关,我们一步步来解决:

1. 修复自定义JsonConverter的逻辑

你的ReadJson方法里调用serializer.Deserialize<Vector2Int>(reader)会陷入循环调用(因为转换器已经注册给Vector2Int了),而且此时reader读取到的是"(x,y)"格式的字符串,直接反序列化必然报错。我们需要手动解析这个字符串来生成Vector2Int:

using Newtonsoft.Json;
using UnityEngine;
using System;
using System.Text.RegularExpressions;

public class Vec2Converter : JsonConverter
{
    // 序列化时保持原有逻辑,输出Vector2Int的ToString()格式
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        var vec = (Vector2Int)value;
        writer.WriteValue(vec.ToString());
    }

    // 反序列化时手动解析"(x,y)"格式的字符串
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.String)
        {
            var str = reader.Value.ToString().Trim();
            // 用正则提取x和y的数值,兼容带空格的格式比如"(1, 2)"
            var match = Regex.Match(str, @"\((-?\d+),\s*(-?\d+)\)");
            if (match.Success)
            {
                int x = int.Parse(match.Groups[1].Value);
                int y = int.Parse(match.Groups[2].Value);
                return new Vector2Int(x, y);
            }
        }
        // 解析失败时抛出明确异常,方便排查问题
        throw new JsonSerializationException($"无法将值 {reader.Value} 转换为Vector2Int");
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(Vector2Int);
    }
}

2. 确保转换器正确生效

有两种可靠的方式让转换器生效,选择其中一种即可:

方式一:在字段上添加特性标记

直接在Lineup类的cardLocations字段上标记转换器,让Newtonsoft.Json自动识别:

public class Lineup
{
    [JsonConverter(typeof(Vec2Converter))] // 添加这个特性
    public Dictionary<Vector2Int, Collection> cardLocations;
    // 其他字段...
}

方式二:序列化/反序列化时传入转换器实例

调用JsonConvert方法时,手动传入包含转换器的配置:

// 序列化示例
var jsonSettings = new JsonSerializerSettings();
jsonSettings.Converters.Add(new Vec2Converter());
string serializedJson = JsonConvert.SerializeObject(userInfoInstance, jsonSettings);

// 反序列化示例
UserInfo deserializedUser = JsonConvert.DeserializeObject<UserInfo>(serializedJson, jsonSettings);

3. 解决Unity崩溃的问题

当你修改Vector2Int为其他数据结构时Unity崩溃,本质是旧的序列化Json数据和新的类型不匹配,反序列化时触发未捕获的致命异常导致进程崩溃。解决方法:

  • 测试阶段先清理旧的Json数据(比如删除PlayerPrefs存储文件、清空测试用的Json字符串)
  • 如果需要兼容旧数据,要确保新类型的反序列化逻辑能处理旧格式,或者提前做数据迁移

验证修复

完成上述修改后,重新测试序列化和反序列化流程:

  1. 序列化UserInfo对象,确认cardLocations的Key是"(x,y)"格式的字符串
  2. 反序列化后检查cardLocations的Key是否正确转换为Vector2Int实例,不再抛出ArgumentException

内容的提问来源于stack exchange,提问作者Seaky

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:55:20