Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自定义JSON反序列化器ServiceStack_C#_Json_Polymorphism_<img Src="//i.stack.imgur.com/WM7S8.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">servicestack_Deserialization - Fatal编程技术网 servicestack,deserialization,C#,Json,Polymorphism,servicestack,Deserialization" /> servicestack,deserialization,C#,Json,Polymorphism,servicestack,Deserialization" />

C# 自定义JSON反序列化器ServiceStack

C# 自定义JSON反序列化器ServiceStack,c#,json,polymorphism,servicestack,deserialization,C#,Json,Polymorphism,servicestack,Deserialization,我试图反序列化JSON格式的对象集合,它们有一个公共父类,但是当ServiceStack反序列化我的请求时,我得到父类类型集合中的所有元素,而不是每个单独的子类。是否可以创建自定义反序列化程序并避免ServiceStack自动反序列化 例如: class Canine { public Types Type { get; set; } } class Dog : Canine { public Dog() { Type = Types.Dog; } }

我试图反序列化JSON格式的对象集合,它们有一个公共父类,但是当ServiceStack反序列化我的请求时,我得到父类类型集合中的所有元素,而不是每个单独的子类。是否可以创建自定义反序列化程序并避免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.NET反序列化这个JSON

    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();
    }
}
公共类CanineConverter:JsonConverter{
公共覆盖布尔CanConvert(类型objectType){
返回类型(犬科)。IsAssignableFrom(objectType);
}
公共重写对象ReadJson(JsonReader阅读器,类型objectType,对象existingValue,JsonSerializer序列化程序){
var item=JObject.Load(读卡器);
开关(项[“类型”].Value()){
案例2:返回项.ToObject();
案例3:返回项.ToObject();
}
返回项[“类型”].Value();
}
公共重写void WriteJson(JsonWriter编写器、对象值、JsonSerializer序列化器){
抛出新的NotImplementedException();
}
}
请参阅此答案,了解为什么以及如何使ServiceStack保留类型信息,这些信息仅针对绝对需要的类型发出后期绑定的.NET类型信息,即
接口
、后期绑定的
对象
类型或
抽象

解决方案是将Canine的基类更改为抽象类型:

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

谢谢你的回答,在我的特殊情况下,我认为最好还是坚持继承,即使我看到了你的链接。我的解决方案为需要它的类型创建了一个自定义反序列化器,并为请求创建了一种新格式,以避免ServiceStack自动反序列化我的DTO。