2016-10-10 38 views
1

似乎有在ServiceStack方法TypeSerializer.DeserializeFromString關於可空類型ServiceStack TypeSerializer.DeserializeFromString錯誤使用C#可空類型

的錯誤這是一個已知的問題? 有沒有修復或解決方法?

考慮下面的代碼,其中包括強制執行對任何反序列化錯誤異常拋出一個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); 
} 

的varaible originalData內的JSON導致異常(下面詳細說明)「無法設置屬性‘RatioRight’與'null'「。 儘管'RatioRight'是'可空的單個','null'是一個有效的值,但這種情況發生。

刪除scope.ThrowOnDeserializationError = true「工作」,但不是我們的選擇,因爲我們需要驗證服務器端收到的數據。 我會解釋一下,如果我們將ThrowOnDeserializationError設置爲false(這是默認設置),則在此特定情況下不會拋出錯誤,但可以發送類似於此的json:{FlowRight:970045,RatioRight:fdfd} DeserializeFromString的結果不會拋出例外,儘管'fdfd'不是一個可空的單個。會發生什麼情況是,異常將在內部處理,而空將被設置,導致服務器不知道發送的數據是無效的,並且稍後會導致保存空值而不是已經在db中的值(如我提到的,不能接受我們)

例外:

來源:ServiceStack.Text

Exception: Failed to set property 'MeasurementData' with '{FlowRight:970045,RatioRight:null}' InnerException: Failed to set property 'RatioRight' with 'null'

StackTrace: at ServiceStack.Text.Common.DeserializeTypeRefJsv.StringToType(TypeConfig typeConfig, String strType, EmptyCtorDelegate ctorFn, Dictionary'2 typeAccessorMap) at ServiceStack.Text.Common.DeserializeType'1.<>c__DisplayClass3.b__2(String value) at ServiceStack.Text.TypeSerializer.DeserializeFromString(String value, Type type) at Site.Service.Services.DataDomainService.Any(SaveDataDomainRequest request) in D:\Service\API Services\Domain\Services\DataDomainService.cs:line 93

回答

0

ServiceStack.Text的TypeSerializer使用它採用CSV逃逸所以null值作爲替代治療JSV Format一個"null"字符串哪個不能轉換爲數字,導致錯誤。

要保留默認值,它應該從JSV發出,如:

var originalData = "{FlowRight:970045}"; 

如果你不是尋找一個JSON序列,你應該使用JsonSerializer,如:

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

哪可以使用擴展方法更簡潔地重寫,例如:

var object = originalData.ToString().FromJson<MeasurementsData>();