2013-01-11 55 views
4

我們正在從Json.NET切換到ServiceStack.Text,並且遇到了多態集合序列化的問題。使用ServiceStack.Text序列化多態集合

在JSON.NET我用來創建一個自定義JsonCreationConverter並重寫Create()方法來選擇我要創建的類型 - 概述的位置:

http://dotnetbyexample.blogspot.co.uk/2012/02/json-deserialization-with-jsonnet-class.html

有問題的集合List<ItemBase>其中可以包含FlightItemCarHireItem對象。

這是我的版本的Create()方法對JSON.NET:

protected override ItemBase Create(Type objectType, JObject jsonObject) 
     { 
      var itemType = jsonObject["Type"].ToString(); 
      switch (itemType) 
      { 
       case "flight": 
        return new FlightItem(); 
       case "carhire": 
        return new CarHireItem(); 
       default: 
        return null; 
      } 
     } 

那是可能的ServiceStack?

ServiceStack中的多態集合的序列化和反序列化工作,然而,它將對象類型附加到JSON輸出,例如,

"__type" : "TestProject.Model.FlightItem, TestProject" 

這意味着我需要在發佈JSON時提供的類型,我不具有.NET類型的API調用內的任何人都可見太熱衷。

有什麼建議嗎?如果可以用不同的方式做到這一點,你能指點我一些例子嗎?

回答

6

首先,Interfaces or abstract types in DTOs are a bad idea

您現在處於奇怪的位置,您嘗試支持DTO中的多態類型,但不想提供JSON序列化程序特定的信息?你需要定製的代碼來支持多態DTO的原因是因爲根據線格式不可能知道應該使用什麼具體類型,所以爲什麼ServiceStack會爲此目的發出__type屬性。

爲了避免這些黑客入侵,並使其在所有JSON序列化器中同樣適用,最好將您的多態類型「扁平化」爲單個「扁平」DTO,然後通過電線發送。一旦你回到C#中,你可以使用代碼將其投影到理想的類型中。

ServiceStack確實提供了一些JsConfig<ItemBase>.RawDeserializeFn,它可以讓您執行類似操作,請參閱CustomSerializerTests for an example。還有JsConfig<ItemBase>.OnDeserializedFn掛鉤可能會有所幫助,但它取決於ItemBase是否包含兩種具體類型的完整屬性列表。

+0

解決了這個問題 - 感謝您的幫助 –

相關問題