ServiceStack TypeSerializer.DeserializeFromString错误,具有可为空的C类型
ServiceStack方法TypeSerializer.DeserializeFromString中似乎有一个关于可空类型的错误 这是一个已知的问题吗? 是否有修复或解决方法 考虑以下代码,其中包含一个JsConfig作用域,该作用域强制在任何反序列化错误上引发异常:ServiceStack TypeSerializer.DeserializeFromString错误,具有可为空的C类型,
Warning: implode(): Invalid arguments passed in /data/phpspider/zhask/webroot/tpl/detail.html on line 45
,,ServiceStack方法TypeSerializer.DeserializeFromString中似乎有一个关于可空类型的错误 这是一个已知的问题吗? 是否有修复或解决方法 考虑以下代码,其中包含一个JsConfig作用域,该作用域强制在任何反序列化错误上引发异常: public class MeasurementsData { public int? FlowLeft { get; set; } public int? FlowRight { get; set; }
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);
}
varaible originalData中的json导致异常(如下所述)“无法将属性'RatioRight'设置为'null'”。
尽管'RatioRight'是'nullable single','null'是有效值,但仍会发生这种情况
删除scope.ThrowOnDeserializationError=true
“可行”,但这不是我们的选择,因为我们需要验证服务器端接收的数据。
我将解释,如果我们将ThrowOnDeserializationError
设置为false(这是默认值),则在这种特定情况下不会抛出错误,但它将允许发送类似这样的json:{FlowRight:970045,RatioRight:fdfdfd}
DeserializeFromString的结果不会引发异常,尽管“fdfd”不是可为null的单个值。将发生的情况是,异常将在内部处理,而设置为null,这将导致服务器不知道发送的数据无效,并且稍后将导致保存null值,而不是数据库中已有的值(如我所述,我们不接受)
例外情况:
来源:ServiceStack.Text
异常:无法使用{FlowRight:970045,RatioRight:null}设置属性“MeasurementData”
InnerException:无法将属性“RatioRight”设置为“null”
堆栈跟踪:
在ServiceStack.Text.Common.DeserializeTypeRefJsv.StringToType(TypeConfig TypeConfig、String strType、EmptyCtorDelegate Torfn、Dictionary的2 typeAccessorMap)
在ServiceStack.Text.Common.DeserializeType'1.c__DisplayClass3.b__2(字符串值)
位于ServiceStack.Text.TypeSerializer.DeserializeFromString(字符串值,类型类型)
位于D:\Service\API Services\Domain\Services\DataDomainService.cs中的Site.Service.Services.DataDomainService.Any(SaveDataDomainRequest请求):第93行
ServiceStack.Text的TypeSerializer使用CSV转义,因此
null
值被视为“null”
字符串,无法转换为数字,从而导致错误
要保留默认值,应该从JSV发出,例如:
var originalData = "{FlowRight:970045}";
如果您正在寻找JSON序列化程序,则应使用JsonSerializer
,例如:
var afterConversionData = JsonSerializer.DeserializeFromString(
originalData.ToString(), typeof(MeasurementsData));
可以使用扩展方法更简洁地重写,例如:
var object = originalData.ToString().FromJson<MeasurementsData>();
var object=originalData.ToString().FromJson();
ServiceStack.Text的TypeSerializer使用CSV转义,因此null
值被视为无法转换为数字的“null”
字符串,从而导致错误
要保留默认值,应该从JSV发出,例如:
var originalData = "{FlowRight:970045}";
如果您正在寻找JSON序列化程序,则应使用JsonSerializer
,例如:
var afterConversionData = JsonSerializer.DeserializeFromString(
originalData.ToString(), typeof(MeasurementsData));
可以使用扩展方法更简洁地重写,例如:
var object = originalData.ToString().FromJson<MeasurementsData>();
var object=originalData.ToString().FromJson();