如何解决如何使用 System.Text.Json 序列化/反序列化非枚举类型的嵌套字典?
我正在尝试序列化这本字典:
IDictionary<string,ResetableObjectTheme> ResetableObjectThemes = new Dictionary<string,ResetableObjectTheme>()
{
{"ThemeDark",new ResetableObjectTheme() { ResetablePatternObject = new PatternObject(),ResetableMaterialObject = new MaterialObject()}},{"ThemeLight",};
string json = System.Text.Json.JsonSerializer.Serialize(ResetableObjectThemes,new JsonSerializerOptions() { WriteIndented = true });
之后我得到一个错误的结果字符串json,如下所示:
{
"ResetableObjectThemes": {
"ThemeDark": {
"ResetablePatternObject": {},"ResetableMaterialObject": {}
},"ThemeLight": {
"ResetablePatternObject": {},"ResetableMaterialObject": {}
}
}
}
但它应该是这样的:
{
"ResetableObjectThemes": {
"ThemeDark": {
"ResetablePatternObject": {
"Thickness": 3,"BoundaryColor": {
"ColorContext": null,"A": 255,"R": 0,"G": 0,"B": 128,},"ResetableMaterialObject": {
"BoundaryThickness": 3,"B": 255,}
},"ThemeLight": {
"ResetablePatternObject": {
"Thickness": 3,}
}
}
}
课程是:
public class ResetableObjectTheme
{
public ResetableBaseObject ResetablePatternObject { get; set; } = new PatternObject();
public ResetableBaseObject ResetableMaterialObject { get; set; } = new MaterialObject();
}
public class PatternObject : ResetableBaseObject
{
public double Thickness { get; set; } = 1;
public Color BoundaryColor { get; set; } = Colors.Blue;
}
public class MaterialObject : ResetableBaseObject
{
public double BoundaryThickness { get; set; } = 3;
public Color BoundaryColor { get; set; } = Colors.Blue;
}
而ResetableBaseObject只是一个包含通用方法的基类。 我已经将这种方法用于其他东西,而不是类型 ResetableBaseObject,而是使用枚举并且序列化/反序列化工作得很好。 使用字典的原因是这样我可以根据一些 UI 主题动态设置值:
ResetableObjectThemes[ThemeManager.CurrentTheme].ResetablePatternObject = new PatternObject() { Thickness = 5.5 };
为什么 System.Text.Json.JsonSerializer.Serialize/Deserialize 无法为嵌套的非枚举类型完成这项工作?
解决方法
您对 ResetableObjectTheme
的属性使用了多态,而 System.Text.Json
默认不支持多态。来自docs:
不支持多态类型层次结构的序列化。。例如,如果一个属性被定义为接口或抽象类,则只有在接口或抽象类上定义的属性才会被序列化,即使运行时类型有额外的属性。
此行为的例外情况在本节中说明...
绕过限制的最简单方法是将 ResetableObjectTheme
的属性声明为适当的派生类型:
public class ResetableObjectTheme
{
public PatternObject ResetablePatternObject { get; set; }
public MaterialObject ResetableMaterialObject { get; set; }
}
如果您确实需要序列化和反序列化多态子类型,则需要创建一个 custom JsonConverter
,例如Is polymorphic deserialization possible in System.Text.Json?。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。