• 注册
  • 离线疑难解答 离线疑难解答 关注:1821 内容:22085
    悬赏4金币

    SPT服务端报错

  • 查看作者
  • 打赏作者
  • 当前位置: ODDBA社区 > 离线疑难解答 > 正文
  • 12
  • 离线疑难解答
  • 初来乍到

    不知道什么原因这两天总是会出现这种情况,重启了电脑也没有用,最开始的时候只要在STP.launcher程序里清理临时文件就可以解决的,直到这两天老是频繁出现这种错误,求大佬帮忙看看,如果有大佬需要看完整的错误报告我可以发给你,小的在这先谢过各位大佬了SPT服务端报错

  • 4.0.13

  • 已配图

  • 服务端报错

  • 初来乍到

    我在看报错的时候发现了一段这样的‘计划中事件:“SPTarkov.Server.Core.Callbacks.SaveCallbacks”运行失败。’这又是因为啥


    回复
    初来乍到

    问了AI,给了这样的回复

    这个错误的核心在于 JSON 序列化时遇到了无法处理的特殊浮点数值(如正无穷、负无穷或 NaN)。

    根据你提供的错误日志,这是在使用 C# 的 System.Text.Json 进行序列化时发生的典型问题。以下是详细的分析和解决方案:

    1. 错误原因分析

    • 核心冲突:.NET 中的 doublefloat 类型支持 PositiveInfinity(正无穷)、NegativeInfinity(负无穷)和 NaN(非数字)。然而,标准的 JSON 规范(RFC 8259)不支持这些特殊值,它只接受标准的有限数字。

    • 触发场景:在你的代码(涉及 SPTarkov 服务器逻辑,特别是 QuestCallbacks.ActivityPeriods)中,某个对象的属性值被计算或赋值为了 double.PositiveInfinitydouble.NegativeInfinitydouble.NaN。当 System.Text.Json 尝试将该对象转换为 JSON 字符串时,由于无法将这些值写入 JSON,抛出了 ArgumentException

    2. 解决方案

    要解决这个问题,通常有以下几种方法,建议根据你的具体代码结构选择:

    方案 A:配置序列化选项(推荐,如果可以修改序列化设置)

    如果你能控制 JsonSerializerOptions,可以添加一个属性级的处理程序,允许将这些特殊值序列化为 JSON 中的特定字符串(如 "Infinity", "-Infinity", "NaN")。

    在你的序列化配置中(例如在 JsonUtil 或相关初始化代码中),添加以下设置:

    using System.Text.Json;
    using System.Text.Json.Serialization;
    
    var options = new JsonSerializerOptions
    {
        // 其他设置...
    };
    
    // 假设你要序列化的类型是 MyClass,且包含一个 double 属性 MyValue
    // 你需要为包含这些特殊值的属性或类型添加处理程序
    options.Converters.Add(new JsonNumberHandler(JsonNumberHandling.AllowNamedFloatingPointLiterals));

    注意JsonNumberHandling.AllowNamedFloatingPointLiterals 是 .NET 5 及以上版本提供的功能,它允许序列化器将 NaNInfinity 等写为 JSON 字符串。但是,这需要你的客户端(解析 JSON 的一方)也能理解这些字符串并将其反序列化回对应的 .NET 值,否则可能会导致客户端解析错误。

    方案 B:数据预处理(最稳妥)

    在将数据传递给序列化器之前,检查并替换掉这些非法值。通常将它们替换为 null 或一个特定的“哨兵值”(如 0-1),具体取决于业务逻辑。

    在你的 ActivityPeriods 或相关数据生成逻辑中,找到可能产生无穷大或 NaN 的计算,并进行修正:

    // 示例:在设置属性值时进行检查
    double value = CalculateSomeValue(); // 这个计算可能返回 Infinity 或 NaN
    
    // 修正逻辑
    if (double.IsInfinity(value) || double.IsNaN(value))
    {
        value = 0; // 或者 null (如果属性是 double?)
    }
    
    // 然后赋值给对象进行序列化
    myObject.MyProperty = value;

    方案 C:自定义转换器

    如果上述方案不适用,你可以编写一个自定义的 JsonConverter,专门处理包含这些特殊值的类型,在序列化时将其转换为 JSON 支持的格式(例如对象 {"type": "infinity", "sign": "positive"} 或简单的数字 0)。

    3. 针对 SPTarkov 的具体建议

    根据堆栈跟踪,错误发生在 SPTarkov.Server.Core.Utils.JsonUtil.Serialize。建议你检查以下位置:

    1. 检查 Quest 数据:查看与 ActivityPeriods 相关的任务(Quest)配置数据。是否有某个任务的时间、概率或数值被错误地设置为了 0(导致除以零错误产生无穷大)或者未定义的值?

    2. 检查 JsonUtil:查看 JsonUtil.Serialize 方法的实现。它是否使用了默认的 JsonSerializerOptions?如果是,尝试修改该方法,引入允许特殊浮点数的选项,或者在序列化前对输入对象进行清洗。

    总结:根本原因是数据中包含了 JSON 不支持的特殊浮点数。最直接的修复方式是在业务逻辑层确保不会生成 InfinityNaN,或者升级序列化配置以兼容这些值。

  • eft00225588看这个回复我猜用的豆包,这类程序问题,就算真要问ai换Trae更有用
    拉黑 20分钟前 电脑端回复
  • jixuanlv其实问的是千问 [s-1]
    拉黑 16分钟前 电脑端回复
  • 回复
    渐入佳境

    我看到你报错里有at system Text.json ,我猜你用了MGMod,删掉应该就好了,如果没用Mg那我也不知道了

  • jixuanlvMGmod我貌似下载过一个,但是我也不记得是哪个了,我截图给你看看
    拉黑 18分钟前 电脑端回复
  • 回复
    初来乍到

    我就下载了三个模组我也不知道是哪个的问题了

  • eft00225588也没有装MGmod,你试一下清理临时文件然后把SVM先删掉看还报错不,如果也不是这个的问题,那就把全部mod都删掉,还不行就只能重装了
    拉黑 11分钟前 电脑端回复
  • jixuanlv好的我现在就去试试看
    拉黑 9分钟前 电脑端回复
  • jixuanlv @eft00225588 我想了一下如果是SVM出了问题,有没有可能会是我改动的东西有点多了呢 [s-5]
    拉黑 6分钟前 电脑端回复
  • eft00225588 @jixuanlv 理论上说,这个mod既然列出了能改的东西,那就不会因为改动导致报错,但是实际上我见过不少SVM和MG报错的,试试吧,如果SVM导致的报错,要么先删掉正常了再装回去,要么就直接改游戏文件
    拉黑 1分钟前 电脑端回复
  • jixuanlv @eft00225588 的确是SVM的问题,这样的话我还可不可以用SVM呢
    拉黑 31秒前 电脑端回复
  • 回复

    请登录之后再进行评论

    登录
    离线疑难解答
  • 今日 14
  • 内容 22085
  • 关注 1821
  • 聊天
    关注 0

    【招募】GRIFFIN TKF项目开工 期待你的加入 || 你是否想加入格里芬书写自己与人形的故事

    捐助我们

    • 微信
    • 支付宝
  • 签到
  • 任务
  • 发布
  • 模式切换
  • 偏好设置
  • 帖子间隔 侧栏位置: