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

C# JSON序列化派生类异常:Player仅序列化基类Character属性

解决System.Text.Json序列化派生类仅保存基类属性的问题

你的问题核心出在两个关键点上:

  1. System.Text.Json默认只序列化公共属性,不序列化公共字段
    Player类中的Sanity、ActualWeight是公共字段(未定义get; set;),因此不会被序列化。私有字段Maxweight无论如何都不会被默认序列化。
  2. 你添加的[JsonDerivedType]特性主要作用于反序列化阶段(当以基类Character类型序列化对象时,会自动添加类型鉴别符,确保反序列化能还原为Player类型),并非当前序列化丢失字段的原因。

解决方法一:将字段改为属性(推荐)

这是符合C#封装规范的做法,修改Player类:

public class Player : Character
{
    public int Sanity { get; set; }
    public int ActualWeight { get; set; }
    public int Maxweight { get; set; } // 若需要保存最大重量则改为公共属性,不需要则保持私有

    public Player() {}
    public Player(string? Name, int HP, int Sanity, int Maxweight) : base(Name, HP)
    {        
        this.Sanity = Sanity;
        this.ActualWeight = 0;
        this.Maxweight = Maxweight;
    }
}

解决方法二:开启字段序列化(快速兼容现有代码)

如果不想修改字段为属性,可以在序列化配置中启用字段序列化:

var options = new JsonSerializerOptions 
{ 
    WriteIndented = true,
    IncludeFields = true // 开启公共字段的序列化支持
};

注意:私有字段Maxweight仍不会被序列化,若必须保存它,需给其添加[JsonInclude]特性并调整访问级别,但不推荐破坏封装。

验证效果

修改后重新运行代码,生成的SavePlayer.json会包含Player类的所有目标成员,示例输出:

{
  "$type": "Player",
  "Sanity": 100,
  "ActualWeight": 0,
  "Maxweight": 100,
  "Name": "Mario",
  "HP": 100
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 02:13:12