我创建了一个类,其中包含一个函数,使用"this"将自身序列化为JSON字符串。关键字,则该类随后由子类继承。
public class Parent
{
int a { get; set; }
public ToJsonString()
{
return JsonSerializer.Serialize(this);
}
}
public class Child : Parent
{
int b { get; set; }
}
如果子类的实例调用ToJsonString()函数,返回的字符串是否包含子类的属性,还是只包含父类的属性?
Child instance = new Child();
string serialized = instance.ToJsonString();
这很容易测试,见下面的代码。
原始版本的ToJsonString
有一个Parent
参数,只序列化Parent
属性。这可以通过在Child
中用相同的实现重写ToJsonString
来补救:
using System.Text.Json;
Console.WriteLine($"Using parent version of 'ToJsonString': {new Child().BaseToJsonString()}");
Console.WriteLine($"Using child version of 'ToJsonString': {new Child().ToJsonString()}");
Console.WriteLine($"Using better version of 'ToJsonString': {new Child().BetterToJsonString()}");
public class Parent
{
public int A { get; set; } = 1;
public string BaseToJsonString()
{
return JsonSerializer.Serialize(this);
}
public virtual string ToJsonString()
{
return JsonSerializer.Serialize(this);
}
public string BetterToJsonString()
{
return JsonSerializer.Serialize(this, GetType());
}
}
public class Child : Parent
{
public int B { get; set; } = 2;
public override string ToJsonString()
{
return JsonSerializer.Serialize(this);
}
}
这个收益率:
使用父版本的'ToJsonString': {"A":1}
使用子版本的'ToJsonString': {"B":2,"A":1}
使用更好版本的'ToJsonString': {"B":2,"A":1}
编辑:
正如Petrusion正确指出的那样,另一个更简单的解决方案是强制Serialize
方法使用实际的运行时类型(参见上面的BetterToJsonString
方法)。