我需要向客户端返回一个包含VMoney
类的字段的对象
public class VMoney
{
public Decimal Value { get; }
public VMoney(Decimal value)
{
Value = value;
}
}
我继承了班级LimitedVMoney
:
public class LimitedVMoney : VMoney
{
public DateTime? BeginDateTime { get; }
public DateTime? EndDateTime { get; }
public LimitedVMoney(Decimal value, DateTime? beginDateTime, DateTime? endDateTime) : base(value)
{
if (beginDateTime is null && endDateTime is null) throw new ArgumentException();
BeginDateTime = beginDateTime;
EndDateTime = endDateTime;
}
}
因为当发送到客户端时,可以发送VMoney
或LimitedVMoney
,所以我创建了VMoneyConverter : JsonConverter<VMoney>
public class VMoneyConverter : JsonConverter<VMoney>
{
public override VMoney? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
using (JsonDocument doc = JsonDocument.ParseValue(ref reader))
{
var root = doc.RootElement;
root.TryGetProperty("beginDateTime", out JsonElement beginDateTimeElement);
root.TryGetProperty("endDateTime", out JsonElement endDateTimeElement);
DateTime? beginDateTime = beginDateTimeElement.ValueKind == JsonValueKind.String
? beginDateTimeElement.GetDateTime()
: null;
DateTime? endDateTime = endDateTimeElement.ValueKind == JsonValueKind.String
? endDateTimeElement.GetDateTime()
: null;
Decimal value = root.GetProperty("value").GetDecimal();
return VMoneyFactory.Create(value, beginDateTime, endDateTime);
}
}
public override void Write(Utf8JsonWriter writer, VMoney value, JsonSerializerOptions options)
{
if(value is LimitedVMoney limitedVMoney)
{
JsonSerializer.Serialize(writer, limitedVMoney, options);
return;
}
JsonSerializer.Serialize(writer, value, options);
}
}
事实证明,如果类在序列化时是VMoney
,那么它将无休止地进入Write
方法,之后应用程序将崩溃.
我将解释为什么最初决定编写一个定制的转换器.
如果发送了VMoney
,那么它就像应该的那样完美地带有Value字段,但是如果发送了LimitedVMoney
,那么它就带有Value字段,但没有BeginDateTime
,EndDateTime
.
在编写了一个转换器后,结果是,LimitedVMoney
与所有字段都是正确的,但VMoney
由于循环而不是正确的.