6 c# serialization .net-core .net-core-3.0 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; }
}
Run Code Online (Sandbox Code Playgroud)
它们应该被用作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);
Run Code Online (Sandbox Code Playgroud)
这会生成以下 JSON:
[{"Type":"ConsoleMessage"},{"Type":"HitpointsUpdate"}]
Run Code Online (Sandbox Code Playgroud)
为了进行比较,使用Newtonsoft.Json.JsonConvert.SerializeObject(gameUpdates)会产生以下结果:
[{"Type":"ConsoleMessage","MessageContent":"Chimzee lost 10 HP!"},{"Type":"HitpointsUpdate","MonsterID":5,"NewHP":90}]
Run Code Online (Sandbox Code Playgroud)
使用 是否可以达到类似的结果System.Text.Json?
为什么我问这个:我一直在尝试开发一个基于浏览器的游戏作为一个业余爱好项目,这正是我实现服务器与浏览器通信的方式。随着 Asp .NET Core 3 的发布,其文档鼓励从 Newtonsoft.JSON 迁移到 System.Text.Json。在阅读文档中了解到多态序列化是可能的后,我删除了 Newtonsoft 相关代码并开始使用 System.Text.Json,却发现游戏不再工作。
这有效:
var gameUpdates = new List<object>
{
new ConsoleMessage { MessageContent = "Chimzee lost 10 HP!"},
new HitpointsUpdate { MonsterID = 5, NewHP = 90 }
};
var json = JsonSerializer.Serialize(gameUpdates);
Console.WriteLine(json);
Run Code Online (Sandbox Code Playgroud)
[{"Type":"ConsoleMessage","MessageContent":"Chimzee lost 10 HP!"},{"Type":"HitpointsUpdate","MonsterID":5,"NewHP":90}]
旁注:您的方法可能很危险,您必须保留允许类型的白名单才能再次反序列化,否则攻击者可以注入自己类型的创建...仅序列化一个集合中的一种类型的对象要安全得多。
如果攻击者注入如下代码怎么办:
“类型”:“System.Drawing.Bitmap”,“宽度”:“100000”,“高度”:“100000”
| 归档时间: |
|
| 查看次数: |
1340 次 |
| 最近记录: |