【发布时间】:2020-04-23 09:16:39
【问题描述】:
根据documentation of System.Text.Json:
要序列化派生类型的属性,请使用以下方法之一:
- (...)
- 将要序列化的对象声明为
object。
不幸的是,正如我刚刚发现的那样,这不允许序列化列表成员的派生属性。考虑以下 DTO 类:
public abstract class GameUpdate
{
public abstract string Type { get; }
}
public class ConsoleMessage : GameUpdate
{
public override string Type => "ConsoleMessage";
public string MessageContent { get; set; }
}
public class HitpointsUpdate : GameUpdate
{
public override string Type => "HitpointsUpdate";
public long MonsterID { get; set; }
public long NewHP { get; set; }
}
它们应该用作List<GameUpdate>。不幸的是,将要序列化的列表声明为object 仍然无法序列化重要属性:
var gameUpdates = new List<GameUpdate>
{
new ConsoleMessage { MessageContent = "Chimzee lost 10 HP!"},
new HitpointsUpdate { MonsterID = 5, NewHP = 90 }
};
var json = System.Text.Json.JsonSerializer.Serialize<object>(gameUpdates);
Console.WriteLine(json);
这会产生以下 JSON:
[{"Type":"ConsoleMessage"},{"Type":"HitpointsUpdate"}]
为了比较,使用Newtonsoft.Json.JsonConvert.SerializeObject(gameUpdates) 会产生以下结果:
[{"Type":"ConsoleMessage","MessageContent":"Chimzee lost 10 HP!"},{"Type":"HitpointsUpdate","MonsterID":5,"NewHP":90}]
使用System.Text.Json是否可以达到类似的结果?
我问这个的原因:我一直在尝试开发一个基于浏览器的游戏作为一个爱好项目,而这正是我实现服务器与浏览器通信的方式。 Asp .NET Core 3 出来了its documentation encourages to migrate from Newtonsoft.JSON to System.Text.Json。在阅读了可以进行多态序列化的文档后,我删除了与 Newtonsoft 相关的代码并开始使用 System.Text.Json,却发现游戏不再工作。
【问题讨论】:
标签: c# serialization .net-core .net-core-3.0 system.text.json