2014-10-06 35 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