2

我有一些遙測數據作爲JSON存儲在文本字段中。我試圖對POCO進行逆向工程,無縫地提取和呈現數據,而無需執行任何後處理ForEach循環。ServiceStack ORMLite不反序列化存儲在DB文本字段中的JSON

當我嘗試手動解析數據字段中的JSON字符串時,它可以工作。當我通過ORMLite選擇時,它會返回默認對象。我錯過了什麼?

作品

string x = "{\"alive\":true,\"paperStatus\":\"0:NoIssue\"}"; 
var telemetry = JsonSerializer.DeserializeFromString<KioskTelemetryData>(x); 

不填充數據字段

var exp = Db.From<KioskTelemetryLog>() 
        .Where(q => q.Identifier == request.Identifier) 
        .OrderByDescending(q => q.Timestamp); 

var data = Db.Select(exp); 

下面是數據記錄是這樣的:

Id Identifier IsCurrent RedemptionCenterId Timestamp    Status Data 
1 XXX  0   NULL    2015-11-24 11:10:53.527 1  {"alive":true,"paperStatus":"1:LowPaper"} 
2 XXX  0   NULL    2015-12-01 12:16:56.653 0  {"alive":true,"paperStatus":"0:NoIssue"}  
1 XXX  1   NULL    2015-12-01 18:32:11.337 2  {"alive":false} 

這裏是波蘇斯:

[Alias("TelemetryLog")] 
public class KioskTelemetryLog 
{ 
    public long Id { get; set; } 

    public string Identifier { get; set; } 

    public bool IsCurrent { get; set; } 

    public int? RedemptionCenterId { get; set; } 

    public DateTime Timestamp { get; set; } 

    // 0 = okay, 1 = warning, 2 = error 
    public sbyte Status { get; set; } 

    public KioskTelemetryData Data { get; set; } 
} 

public class KioskTelemetryData 
{ 
    public bool Alive { get; set; } 
    public string PaperStatus { get; set; } 
} 

回答

2

OrmLite的默認複雜類型序列化程序是JSV Format(使用JSON的PostgreSQL除外)。 OrmLite支持pluggable text serializers,例如你可以改變SQL Server使用JSON序列化的複雜類型有:

SqlServerDialect.Provider.StringSerializer = new JsonStringSerializer(); 

如果它不序列化正確它就像一個序列化錯誤,你可以嘗試enable logging有關錯誤的詳細信息,如:

LogManager.LogFactory = new ConsoleLogFactory(debugEnabled:true); 
+0

Ung - 完全錯過了[docs here](https://github.com/ServiceStack/ServiceStack.OrmLite#pluggable-complex-type-serializers)。是否有可能像使用JsonSerializer一樣在查詢的基礎上重寫行爲? – jklemmack

+0

@jklemmack不,你可以暫時覆蓋它並在最後的語句中恢復它,但這不是線程安全的。另一種方法是將屬性聲明爲字符串,然後像'KioskTelemetryData GetData()'那樣返回反序列化的版本。 – mythz

+0

啊 - 我真的很喜歡使用額外的方法來進行反序列化,因爲相同的遙測表保存了幾種不同類別設備的數據。我可能會將其作爲基於類型的只讀屬性來實現。這讓我可以將整個POCO重新轉換爲JSON並將其提供給儀表板網站。 – jklemmack