2014-10-06 34 views
0

我想反序列化JSON格式的對象的集合,至少有一個共同的父類,但是當ServiceStack反序列化我的請求時,我得到了我的父類類型集合中的所有元素,而不是每個單獨的子類。是否有可能創建一個自定義的反序列化器並避免ServiceStack自動反序列化。自定義JSON解串器ServiceStack

例子:

class Canine { 
    public Types Type { get; set; } 
} 

class Dog : Canine { 
    public Dog() { 
     Type = Types.Dog; 
    } 
} 

class Wolf : Canine { 
    public Wolf() { 
     Type = Types.Wolf; 
    } 
} 

public enum Types { 
    Canino = 1, 
    Perro = 2, 
    Lobo = 3 
} 

public class CanineService : Service { 
      public CanineResponse Post(Canine request) { 
       return new Canine().GetResponse(request); 
      } 
     } 

我反序列化JSON這與json.NET

public class CanineConverter : JsonConverter { 
    public override bool CanConvert(Type objectType) { 
     return typeof(Canine).IsAssignableFrom(objectType); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { 
     var item = JObject.Load(reader); 

     switch (item["Type"].Value<int>()) { 
      case 2: return item.ToObject<Dog>(); 
      case 3: return item.ToObject<Wolf>(); 
     } 

     return item["Type"].Value<Types>(); 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { 
     throw new NotImplementedException(); 
    } 
} 

回答

0

查看爲什麼inheritance should avoided in DTO's這個答案,以及如何使ServiceStack保留這是唯一的類型信息爲絕對需要的類型發佈後期綁定的.NET類型信息,即Interfaces,後期綁定的object類型或abstract類。

的解決辦法是改變基礎類犬的是一個抽象類型:

abstract class Canine 
{ 
    public Types Type { get; set; } 
} 
+0

謝謝您的回答,在我的具體情況,我認爲是更好地爲我與繼承堅持,即使我有看到你的鏈接。我的解決方案是爲需要它的類型創建了一個自定義的反序列化器,併爲請求創建了一種新格式,以避免ServiceStack自動對我的DTO進行取捨。 – oscaregerardo 2014-10-08 16:16:25