ServiceStack TypeSerializer.c#可空类型的DeserializeFromString错误

本文关键字:DeserializeFromString 错误 类型 TypeSerializer ServiceStack | 更新日期: 2023-09-27 18:12:24

似乎在ServiceStack方法TypeSerializer中有一个错误。关于可空类型的DeserializeFromString

这是已知的问题吗?有解决办法或变通办法吗?

考虑以下代码,其中包括一个JsConfig作用域,该作用域在任何反序列化错误时强制抛出异常:

public class MeasurementsData
{
    public int? FlowLeft { get; set; }
    public int? FlowRight { get; set; }
    public Single? RatioLeft { get; set; }
    public Single? RatioRight { get; set; }
}
 .
 .
 .
var originalData = "{FlowRight:970045,RatioRight:null}";
object afterConversionData = null;
try
{
    using (var scope = JsConfig.BeginScope())
    {
        scope.ThrowOnDeserializationError = true;
        afterConversionData =TypeSerializer.DeserializeFromString(originalData.ToString() ,typeof(MeasurementsData));
    }
}
catch (System.Runtime.Serialization.SerializationException ex)
{
    Logger.Warn("Service exception", ex);
}

变量originalData中的json导致一个异常(详细如下)"将属性'RatioRight'设置为'null'失败"。尽管'RatioRight'是'可空的单个'并且'null'是一个有效值,但仍会发生这种情况。

删除scope.ThrowOnDeserializationError = true"工作",但不是我们的选择,因为我们需要验证服务器端接收到的数据。我会解释一下,如果我们将ThrowOnDeserializationError设置为false(这是默认值),在这种特定情况下不会抛出错误,但它允许发送像这样的json: {FlowRight:970045,RatioRight:fdfd}DeserializeFromString的结果不会抛出异常,尽管'fdfd'不是一个可空的单变量。会发生的情况是,异常将在内部处理,而null将被设置,导致服务器不知道发送的数据是无效的,并且稍后会导致保存null值而不是数据库中已经存在的值(正如我提到的,对我们来说是不可接受的)

例外:

来源:ServiceStack。文本

异常:用'{FlowRight:970045,RatioRight:null}'设置属性'MeasurementData'失败InnerException:将属性'RatioRight'设置为'null'失败

加:在ServiceStack.Text.Common.DeserializeTypeRefJsv。StringToType(TypeConfig TypeConfig, String strType, EmptyCtorDelegate ctorFn, Dictionary'2 typeAccessorMap)在ServiceStack.Text.Common.DeserializeType 1。你们;> c__DisplayClass3。b__2(字符串值)在ServiceStack.Text.TypeSerializer。DeserializeFromString(字符串值,类型类型)在Site.Service.Services.DataDomainService。任何(SaveDataDomainRequest请求)在D:'Service'API Services'Domain'Services'DataDomainService.cs:line 93

ServiceStack TypeSerializer.c#可空类型的DeserializeFromString错误

ServiceStack。文本的TypeSerializer使用使用CSV转义的JSV格式,因此null值被视为"null"字符串,不能转换为数字,导致错误。

要保持默认值,它应该从jsf发出,例如:

var originalData = "{FlowRight:970045}";

如果你正在寻找一个JSON序列化器,你应该使用JsonSerializer,例如:

var afterConversionData = JsonSerializer.DeserializeFromString(
    originalData.ToString(), typeof(MeasurementsData));

可以使用扩展方法更简洁地重写,例如:

var object = originalData.ToString().FromJson<MeasurementsData>();
相关文章:
  • 没有找到相关文章