C# JSON序列化派生类异常:Player仅序列化基类Character属性
解决System.Text.Json序列化派生类仅保存基类属性的问题
你的问题核心出在两个关键点上:
- System.Text.Json默认只序列化公共属性,不序列化公共字段
Player类中的Sanity、ActualWeight是公共字段(未定义get; set;),因此不会被序列化。私有字段Maxweight无论如何都不会被默认序列化。 - 你添加的
[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
相关产品推荐
相关产品推荐

