Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.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# 反序列化继承的类_C#_Json_Serialization_Asp.net Web Api2 - Fatal编程技术网

C# 反序列化继承的类

C# 反序列化继承的类,c#,json,serialization,asp.net-web-api2,C#,Json,Serialization,Asp.net Web Api2,我想将参数设置从后端应用程序发送到前端。我还需要能够有不同类型的参数(端口号、文件夹、静态字符串等等) 所以我设计了一个基类,参数如下: public abstract class Parameter { public abstract bool isValid(); } 假设我们有两种类型的文件夹参数: public abstract class Folder : Parameter { public string folderName { get; set; }

我想将参数设置从后端应用程序发送到前端。我还需要能够有不同类型的参数(端口号、文件夹、静态字符串等等)

所以我设计了一个基类,参数如下:

public abstract class Parameter
{
    public abstract bool isValid();
}
假设我们有两种类型的文件夹参数:

public abstract class Folder : Parameter
{
    public string folderName { get; set; }

    protected Folder(string folderName)
    {
        this.folderName = folderName;
    }
}

public class ReadWriteFolder : Folder
{
    public ReadWriteFolder(string folderName) : base(folderName)
    {
    }

    public override bool isValid()
    {
        return isReadable() && isWritable();
    }
}

public class ReadFolder : Folder
{
    public ReadFolder(string folderName) : base(folderName)
    {
    }

    public override bool isValid()
    {
        return isReadable();
    }
}
这是从WebAPI使用的,因此这是我的控制器:

public Dictionary<String, Parameter> Get()
{ 
    Dictionary<String, Parameter> dictionary  = new Dictionary<String, Parameter>();
    dictionary.Add("TemporaryFiles", new ReadWriteFolder("C:\\temp\\"));
    dictionary.Add("AnotherTemporaryFiles", new ReadWriteFolder("D:\\temp\\"));

    return dictionary;
}
公共字典Get() { 字典=新字典(); 添加(“临时文件”,新的读写文件夹(“C:\\temp\”); 添加(“其他临时文件”,新的读写文件夹(“D:\\temp\”); 返回字典; } 这将产生以下JSON序列化:
{“临时文件”:{“folderName”:“C:\\temp\\”},其他临时文件:{“folderName”:“D:\\temp\\”}
,这似乎是合理的


我的问题是:如何将其反序列化回原始类型?或者将序列化更改为更易于反序列化的内容?

您使用什么进行序列化?如果它是JSON.Net(这里很多人都会这么说!),那么有很多实际问题:

但关键是类型名处理,它将使用类型信息装饰元素,以便能够反序列化它们:

 JsonSerializerSettings settings = new JsonSerializerSettings
 {
    TypeNameHandling = TypeNameHandling.All
 };

string strJson = JsonConvert.SerializeObject(dictionary, settings);
然后您应该能够直接反序列化

var returnDictionary = JsonConvert.DeserializeObject<Dictionary<String, Parameter>>(strJson, settings)
var returnDictionary=JsonConvert.DeserializeObject(strJson,设置)

这就是线索!我实际上不知道我使用了JSON.net(我刚刚使用了WebAPI模板提供的那个)。一旦我设置了TypeNameHandling参数,一切都按照我的预期工作。谢谢